(57)【要約】【課題】ノンセキュアＯＳ部にて実行される実行モジュールの改ざんの有無を検出する。【解決手段】  バスから受信した状態情報に基づいて、メインプロセッサ部のモードを判定し、セキュアモニタメモリ設定部による設定にしたがって、メインプロセッサ部からメインメモリ部へのリードとライトの許可、及び禁止を制御するアドレス空間制御部と、セキュアＯＳ部で実行する実行モジュールをメインメモリ部の共有領域へと書き込む共有領域ライト部と、共有領域に書き込まれた実行モジュールを、実行モジュール用のメモリ領域へとライトする実行モジュールロード部と、実行モジュール用のメモリ領域にライトされた実行モジュールを実行するアプリ実行部と、を備える。【選択図】図２７
2014191509.tif 000002
【特許請求の範囲】
【請求項１】
データを記憶するメインメモリ部と、
セキュアモードとノンセキュアモードとに選択的に切り替えることが可能であって、現在のモードを示す状態情報をバスに送信する状態送信部を有し、前記メインメモリ部に記憶されたデータをリード、及び前記メインメモリ部へデータをライトし、前記メインメモリ部にセキュアＯＳ部自身のＯＳ実行イメージをライトするメインプロセッサ部と、
前記メインプロセッサ部によって、前記セキュアモードの場合に実行されるセキュアＯＳ部と、
前記メインプロセッサ部によって、前記セキュアモードの場合に実行される実行モジュール部と、
前記メインプロセッサ部によって、前記ノンセキュアモードの場合に実行されるノンセキュアＯＳ部と、
前記メインプロセッサ部のモードが前記セキュアモード及び前記ノンセキュアモードの時にリードとライトを許可する共有領域と、前記メインプロセッサ部のモードが前記セキュアモードの時にリードとライトを許可し、前記メインプロセッサ部のモードが前記ノンセキュアモードの時にリードとライトを禁止する前記実行モジュール用のメモリ領域とをアドレス空間制御部に対して設定するセキュアモニタメモリ設定部と、
前記バスから受信した前記状態情報に基づいて、前記メインプロセッサ部のモードを判定し、前記セキュアモニタメモリ設定部による設定にしたがって、前記メインプロセッサ部から前記メインメモリ部へのリードとライトの許可、及び禁止を制御するアドレス空間制御部と、
前記セキュアＯＳ部で実行する実行モジュールを前記メインメモリ部の前記共有領域へと書き込む共有領域ライト部と、
前記共有領域に書き込まれた前記実行モジュールを、前記実行モジュール用のメモリ領域へとライトする実行モジュールロード部と、
前記実行モジュール用のメモリ領域にライトされた前記実行モジュールを実行するアプリ実行部と、
を備えることを特徴とする情報処理装置。
【請求項２】
前記ノンセキュアＯＳ部が前記セキュアＯＳ部へと依頼した命令が、前記実行モジュールの前記メインメモリ部の前記実行モジュール用のメモリ領域へのライト、又は前記実行モジュールの実行であるかを判定する命令セレクタ部と、
を更に備え、
前記実行モジュールロード部は、前記ノンセキュアＯＳ部からの命令が、前記実行モジュールの前記メインメモリ部の前記実行モジュール用のメモリ領域へのライトである場合に、前記共有領域に書き込まれた前記実行モジュールを、前記実行モジュール用のメモリ領域へとライトし、
前記アプリ実行部は、前記ノンセキュアＯＳ部からの命令が、前記実行モジュールの実行である場合に、前記実行モジュール用のメモリ領域にライトされた実行モジュールを実行し、
前記共有領域ライト部は、前記ノンセキュアモードで実行され、
前記実行モジュールロード部、及び前記アプリ実行部は前記セキュアモードで実行される
ことを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記命令セレクタ部は、前記ノンセキュアＯＳ部が前記セキュアＯＳ部へと依頼した命令が、前記実行モジュールの署名の検証であるか否かを更に判定し、
前記実行モジュール用のメモリ領域へライトされた前記実行モジュールのハッシュ値を計算して、記憶させるハッシュ値計算部と、
前記命令セレクタ部により、前記ノンセキュアＯＳ部からの命令が、前記実行モジュールの署名の検証であったと判定された場合に、前記ハッシュ値計算部によって計算された前記ハッシュ値に対して所定の秘密鍵で署名を行い、署名付きハッシュ値を前記共有領域にライトするモジュール署名生成部と、
を更に備え、
前記モジュール署名生成部、及び前記ハッシュ値計算部は、前記セキュアモードで実行される
ことを特徴とする請求項２に記載の情報処理装置。
【請求項４】
共通鍵を保存する秘密鍵格納部と、
前記秘密鍵を前記秘密鍵格納部に保存された前記共通鍵で暗号化した暗号化秘密鍵と、前記公開鍵とを前記共有領域に書き込むデータ暗号化部と、を備え、
前記モジュール署名生成部は、前記秘密鍵で前記署名を行い、
前記データ暗号化部は前記セキュアモードで実行される
ことを特徴とする請求項３に記載の情報処理装置。
【請求項５】
第２共通鍵を保存する第２秘密鍵格納部と、
前記実行モジュールが生成するデータを暗号化する際、前記ハッシュ値計算部によって計算された前記実行モジュールのハッシュ値と前記第２秘密鍵格納部に保存された前記第２共通鍵を用いて暗号化し、前記共有領域に書き込む第２データ暗号化部と、を備え、
前記第２データ暗号化部は前記セキュアモードで実行される
ことを特徴とする請求項３に記載の情報処理装置。
【請求項６】
タイマー割り込みを検出して、所定の時間が経過するごとに前記メインプロセッサ部を一方のモードから他方のモードへと移行させるタイマハンドラ部をさらに備える
ことを特徴とする請求項１に記載の情報処理装置。
【請求項７】
データを記憶するメインメモリ部と、
セキュアモードとノンセキュアモードとに選択的に切り替える事が可能であって、現在の前記モードを示す状態情報をバスに送信する状態送信部を有するメインプロセッサ部と、
前記メインプロセッサ部によって、前記セキュアモードの場合に実行されるセキュアＯＳ部と、
前記メインプロセッサ部によって、前記ノンセキュアモードの場合に実行されるノンセキュアＯＳ部と、
前記メインプロセッサ部のモードが前記セキュアモード及び前記ノンセキュアモードの時にリードとライトを許可する共有領域と、前記ノンセキュアＯＳ部のＯＳ実行イメージをライトするノンセキュアＯＳ部用のメモリ領域とをアドレス空間制御部に対して設定するセキュアモニタメモリ設定部と、
前記バスから受信した前記状態情報に基づいて、前記メインプロセッサ部のモードを判定し、前記セキュアモニタメモリ設定部による設定にしたがって、前記メインプロセッサ部から前記メインメモリ部へのリードとライトの許可、及び禁止を制御するアドレス空間制御部と、
装置の起動時に前記ノンセキュアモードにおいて、前記ノンセキュアＯＳ部のＯＳ実行イメージを前記メインメモリ部の所定のメモリ領域に書き込むブートローダ部と、
を備え、
前記セキュアＯＳ部は、前記ノンセキュアＯＳ部用のメモリ領域上に書き込まれた前記ノンセキュアＯＳ部のＯＳ実行イメージから算出されるハッシュ値と、想定される前記ノンセキュアＯＳ部のＯＳ実行イメージのハッシュ値の期待値とを比較し、一致する場合に書き込まれた前記ノンセキュアＯＳ部のデータが正しいものとしてノンセキュアＯＳの実行を許可する
ことを特徴とする情報処理装置。
【請求項８】
前記セキュアモニタメモリ設定部は、前記ノンセキュアＯＳ部用のメモリ領域を、前記セキュアモードの場合にライトを許可し、前記ノンセキュアモードの場合にライトを禁止するよう設定し、
前記ブートローダ部は、前記ノンセキュアＯＳ部のＯＳ実行イメージを、前記共有領域に書き込み、
前記セキュアＯＳ部は、前記ハッシュ値の算出が完了した前記ノンセキュアＯＳ部のＯＳ実行イメージを前記共有領域から、前記ノンセキュアＯＳ部用のメモリ領域へとコピーする
ことを特徴とする請求項７に記載の情報処理装置。
【請求項９】
前記アクセス空間制御部で禁止されるアクセスがあった場合に、例外処理を行って前記ノンセキュアモードから前記セキュアモードに移行させるモニタハンドラ部をさらに備え、
前記セキュアモニタメモリ設定部は、前記ノンセキュアＯＳ部用のメモリ領域を、前記ノンセキュアモードにおいてリードが可能、ライトが不可能なメモリ領域として設定し、
前記ブートローダ部は、前記ノンセキュアモードにおいて起動時に前記ノンセキュアＯＳ部用のＯＳ実行イメージを前記ノンセキュアＯＳ部用のメモリ領域に書き込む命令を送信し、
前記モニタハンドラ部は、前記ブートローダ部による前記ノンセキュアＯＳ部用のメモリ領域への書き込み命令が送信された際に、前記セキュアモードへと移行させて、前記セキュアＯＳ部により処理を継続させ、
前記セキュアＯＳ部は前記セキュアモードにおいて、前記ノンセキュアＯＳ部のＯＳ実行イメージを前記ノンセキュアＯＳ部用のメモリ領域へとコピーする
ことを特徴とする請求項７に記載の情報処理装置。
【請求項１０】
タイマー割り込みを検出して、所定の時間が経過するごとに前記メインプロセッサ部を前記セキュアモードに移行させるタイマハンドラ部をさらに備え、
前記セキュアＯＳ部は、前記タイマハンドラ部による前記タイマー割り込み処理が起こると、前記メインメモリ部に記憶された前記ノンセキュアＯＳ部用のＯＳ実行イメージのうち、ハッシュ値の算出が完了していないものについて、前記ハッシュ値を算出し、算出の完了後に、前記タイマー割り込み処理の開始前の前記ノンセキュアモードの状態に前記メインプロセッサ部を復帰させる
ことを特徴とする請求項７に記載の情報処理装置。
【請求項１１】
タイマー割込み処理を検出して、所定の時間が経過するごとに前記メインプロセッサ部を前記セキュアモードに移行させるタイマハンドラ部をさらに備え、
前記セキュアＯＳ部は、前記メインメモリ部に記憶された前記ノンセキュアＯＳ部のＯＳ実行イメージの前記ハッシュ値を算出し、前記ハッシュ値と、想定される前記ノンセキュアＯＳ部のＯＳ実行イメージのハッシュ値の期待値とを比較し、一致しない場合に書き込まれた前記ノンセキュアＯＳ部が改変されたものとして識別し、前記ノンセキュアＯＳ部に所定のエラー処理を実施させる
ことを特徴とする請求項７に記載の情報処理装置。
【請求項１２】
データを記憶するメインメモリ部と、
セキュアモードとノンセキュアモードとに選択的に切り替えることが可能であって、現在の前記モードを示す状態情報をバスに送信する状態送信部を有し、前記メインメモリ部に記憶されたデータをリード、及び前記メインメモリ部へデータをライトし、前記メインメモリ部にセキュアＯＳ部自身のＯＳ実行イメージをライトするメインプロセッサ部と、を備えるコンピュータに、
前記メインプロセッサ部によって、前記セキュアモードの場合に実行されるセキュアＯＳ部と、
前記メインプロセッサ部によって、前記セキュアモードの場合に実行される実行モジュール部と、
前記メインプロセッサ部によって、前記ノンセキュアモードの場合に実行されるノンセキュアＯＳ部と、
前記メインプロセッサ部のモードが前記セキュアモード及び前記ノンセキュアモードの時にリードとライトを許可する共有領域と、前記メインプロセッサ部のモードが前記セキュアモードの時にリードとライトを許可し、前記メインプロセッサ部のモードが前記ノンセキュアモードの時にリードとライトを禁止する前記実行モジュール用のメモリ領域とをアドレス空間制御部に対して設定するセキュアモニタメモリ設定部と、
前記バスから受信した前記状態情報に基づいて、前記メインプロセッサ部のモードを判定し、前記セキュアモニタメモリ設定部による設定にしたがって、前記メインプロセッサ部から前記メインメモリ部へのリードとライトの許可、及び禁止を制御するアドレス空間制御部と、
前記セキュアＯＳ部で実行する実行モジュールを前記メインメモリ部の前記共有領域へと書き込む共有領域ライト部と、
前記共有領域に書き込まれた前記実行モジュールを、前記実行モジュール用のメモリ領域へとライトする実行モジュールロード部と、
前記実行モジュール用のメモリ領域にライトされた前記実行モジュールを実行するアプリ実行部と、
を実行させるための情報処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、情報処理装置、情報処理プログラムに関する。
【背景技術】
【０００２】
従来、ソフトウェアとして実装されるシステムにおいて、鍵などの秘密情報を解析から防止したり、処理の内容を書き換えられないようしたりする事が求められる場面が存在した。このような場合に対処するためのシステムとして、メインプロセッサにセキュアモードと、ノンセキュアモードの二つのモードを持たせ、改変や解析などの攻撃を防止する必要のあるプログラムはセキュアモードで実行させ、汎用のプログラムはノンセキュアモードで実行させるプロセッサのアーキテクチャが提案されている。
【０００３】
このアーキテクチャでは、セキュアモードとノンセキュアモードで動作させる動作用ソフトウェアであるＯＳ(Operation  System)を別々に用意し、データを暗号化したり復号化したりする処理はセキュアモードで動作するセキュアＯＳ、又はセキュアＯＳ上で動作するアプリケーションソフトウェアで実行する。一方、二次記憶部からのデータのリードなどの汎用の処理はノンセキュアモードで動作するノンセキュアＯＳ部、又はノンセキュアＯＳ部上で動作するアプリケーションソフトウェアとして実行する。すなわち、必要に応じてセキュアモードとノンセキュアモードを遷移させながら実行する構成である。
【０００４】
さらにメインメモリに対するアクセス制御により、ノンセキュアＯＳ部からセキュアＯＳの領域を読んだり、改変したりする事は不可能となっている。これにより、仮にノンセキュアＯＳ部やノンセキュアＯＳ部上で動作するアプリケーションに不具合(バグ)が組み込まれており、この不具合を不正に利用して、ノンセキュアモードで動作するソフトウェアからセキュアＯＳ、又はセキュアＯＳ上で動作するアプリケーションのデータを盗み見たり、改変したりしようとしても、これを防止することができる。このため、保護対象の処理を改変したり、保護対象のデータを取得したりする攻撃を防止することができる。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００８―１３５００４号公報
【非特許文献】
【０００６】
【非特許文献１】ＡＲＭ  Ｓｅｃｕｒｉｔｙ  Ｔｅｃｈｎｏｌｏｇｙ,  ＡＲＭ
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、ＯＳを分離させ、ノンセキュアモードからセキュアモードへのメモリアクセスを防止する手段は提供されていたが、不正なノンセキュアＯＳ部を動作させる事を防止したり、セキュアＯＳ上で動作するアプリケーションがメインメモリ外にデータを出力する際にデータを保護したりするための技術は実現されていなかった。本発明では、鍵などの秘密情報が不正に取得されることを防止し、ひいては、プログラムの不正改変や不正なデータ取得を防止し得るようにした情報処理装置を提供することを目的とする。
【課題を解決するための手段】
【０００８】
上述した課題を解決し、目的を達成するために、本発の実施形態明は、データを記憶するメインメモリ部と、セキュアモードとノンセキュアモードとに選択的に切り替えることが可能であって、現在の前記モードを示す状態情報をバスに送信する状態送信部を有し、前記メインメモリ部から記憶されたデータをリード、及び前記メインメモリ部へデータをライトし、前記メインメモリ部にセキュアＯＳ部自身のＯＳ実行イメージをライトするメインプロセッサ部と、を備える。セキュアＯＳ部は、前記メインプロセッサ部によって、前記セキュアモードの場合に実行される。実行モジュール部は前記メインプロセッサ部によって、前記セキュアモードの場合に実行される。セキュアモニタメモリ設定部は、前記メインプロセッサ部のモードが前記セキュアモード及び前記ノンセキュアモードの時にリードとライトを許可する共有領域と、前記メインプロセッサ部のモードが前記セキュアモードの時にリードとライトを許可し、前記メインプロセッサ部のモードが前記ノンセキュアモードの時にリードとライトを禁止する実行モジュール用のメモリ領域とをアドレス空間制御部に対して設定する。アドレス空間制御部は、前記バスから受信した前記状態情報に基づいて、前記メインプロセッサ部のモードを判定し、前記セキュアモニタメモリ設定部による設定にしたがって、前記メインプロセッサ部から前記メインメモリ部へのリードとライトの許可、及び禁止を制御する。共有領域ライト部は、前記セキュアＯＳ部で実行する実行モジュールを前記メインメモリ部の前記共有領域へと書き込む。実行モジュールロード部は、前記共有領域に書き込まれた前記実行モジュールを、前記実行モジュール用のメモリ領域へとライトする。アプリ実行部は、前記実行モジュール用のメモリ領域にロードされた実行モジュールを実行する。
【図面の簡単な説明】
【０００９】
【図１】図１は、第１の実施形態の情報処理装置のハードウェア構成図。
【図２】図２は、第１の実施形態のメインプロセッサ部で動作するソフトウェアの機能構成図。
【図３】図３は、第１の実施形態のセキュアモニタメモリ設定部がメインメモリ部のメモリ領域を区分けした一例を示す図。
【図４】図４は、第１の実施形態のメモリ部の各メモリ領域に対するアクセスの可否のポリシーを示すデータ構成図。
【図５】図５は、第１の実施形態の情報処理装置で、電源投入からノンセキュアＯＳ部を起動させるまでの処理を示すフロー図。
【図６】図６は、第１の実施形態の変形例１における、メインプロセッサ部で動作するソフトウェアの機能構成図。
【図７】図７は、第１の実施形態の変形例２の情報処理装置で、電源投入からノンセキュアＯＳ部を起動させるまでの処理を示すフロー図。
【図８】図８は、第１の実施形態の変形例３のメインメモリ部の各メモリ領域に対するアクセスの可否のポリシーを示すデータ構成図。
【図９】図９は、第１の実施形態の変形例３のセキュアモニタメモリ設定部がメインメモリ部のメモリ領域を区分けした一例を示す図。
【図１０】図１０は、第１の実施形態の変形例３のメインプロセッサ部で動作するソフトウェアの機能構成図。
【図１１】図１１は、第１の実施形態の変形例３の情報処理装置で、電源投入からノンセキュアＯＳ部を起動させるまでの処理を示すフロー図。
【図１２】図１２は、第１の実施形態の変形例４のメインプロセッサ部で動作するソフトウェアの機能構成図。
【図１３】図１３は、第１の実施形態の変形例４のメインメモリ部の各メモリ領域に対するアクセスの可否のポリシーを示すデータ構成図。
【図１４】図１４は、第１の実施形態の変形例４の情報処理装置で、電源投入からノンセキュアＯＳ部を起動させるまでの処理を示すフロー図。
【図１５】図１５は、第１の実施形態の変形例５のメインプロセッサ部で動作するソフトウェアの機能構成図。
【図１６】図１６は、第１の実施形態の変形例５の情報処理装置で、電源投入からノンセキュアＯＳ部を起動させるまでの処理を示すフロー図。
【図１７】図１７は、第１の実施形態の変形例６のメインプロセッサ部で動作するソフトウェアの機能構成図。
【図１８】図１８は、第１の実施形態の変形例６の情報処理装置で、電源投入からノンセキュアＯＳ部を起動させるまでの処理を示すフロー図。
【図１９】図１９は、第１の実施形態の変形例６のセキュアモニタメモリ設定部がメインメモリ部のメモリ領域を区分けした一例を示す図。
【図２０】図２０は、第１の実施形態の変形例６のセキュアモニタメモリ設定部がメインメモリ部のメモリ領域を区分けした一例を示す図。
【図２１】図２１は、第１の実施形態の変形例７のメインプロセッサ部で動作するソフトウェアの機能構成図。
【図２２】図２２は、第１の実施形態の変形例７のメインメモリ部の各メモリ領域に対するアクセスの可否のポリシーを示すデータ構成図。
【図２３】図２３は、第１の実施形態の変形例７のセキュアモニタメモリ設定部がメインメモリ部のメモリ領域を区分けした一例を示す図。
【図２４】図２４は、第１の実施形態の変形例７の情報処理装置で、電源投入からノンセキュアＯＳ部を起動させるまでの処理を示すフロー図。
【図２５】図２５は、第２の実施形態のメインプロセッサ部で動作するソフトウェアの機能構成図。
【図２６−１】図２６−１は、第２の実施形態の情報処理装置で、タイマー割り込みが発生した時の処理を示すフロー図。
【図２６−２】図２６−２は、第２の実施形態の情報処理装置で、タイマー割り込みが発生した時の処理を示すフロー図。
【図２７】図２７は、第３の実施形態のメインプロセッサ部で動作するソフトウェアの機能構成図。
【図２８】図２８は、第３の実施形態のセキュアモニタメモリ設定部がメインメモリ部のメモリ領域を区分けした一例を示す図。
【図２９】図２９は、第３の実施形態の情報処理装置で、ノンセキュアＯＳ部にて実行モジュールを実行する際の処理を示すフロー図。
【図３０】図３０は、第３の実施形態の変形例８の情報処理装置で、メインプロセッサ部で動作するソフトウェアの機能構成図。
【図３１】図３１は、第３の実施形態の変形例９の情報処理装置で、ノンセキュアＯＳ部にて実行モジュールを実行する際の処理を示すフロー図。
【図３２】図３２は、第３の実施形態の変形例１０のメインプロセッサ部で動作するソフトウェアの機能構成図。
【図３３】図３３は、第３の実施形態の変形例１０のセキュアＯＳ部で実行させる実行モジュールの機能構成図。
【図３４】図３４は、第３の実施形態の変形例１０の情報処理装置で、ノンセキュアＯＳ部にて実行モジュールを実行する際の処理を示すフロー図。
【図３５】図３５は、第３の実施形態の変形例１１のメインプロセッサ部で動作するソフトウェアの機能構成図。
【図３６】図３６は、第３の実施形態の変形例１２のメインプロセッサ部で動作するソフトウェアの機能構成図。
【図３７】図３７は、第３の実施形態の変形例１２の情報処理装置で、ノンセキュアＯＳ部にて実行モジュールを実行する際の処理を示すフロー図。
【発明を実施するための形態】
【００１０】
（第１の実施形態）
以下、実施の形態について図面を参照して詳細に説明する。図１は、第１の実施の形態で説明する情報処理装置１００のハードウェア構成を概略的に示している。この情報処理装置１００としては、例えばデジタルテレビジョン放送受信装置やＳＴＢ(Set  Top  Box)、監視カメラ等を想定している。従来、ノンセキュアモードとセキュアモードを分離し、保護対象の処理はセキュアモードで実行するアーキテクチャについては提案されている。しかしながら、ノンセキュアモードで実行するソフトウェアも保護する場合もある。たとえば、攻撃者はノンセキュアモードで動作するＯＳの内容を改変し、ノンセキュアＯＳ部からセキュアＯＳ部に遷移させず保護対象の処理が実行されないように妨害する、いわゆるＤｏＳ(Denial  of  Service)攻撃を仕掛けるかもしれない。また、レガシーシステムでは、そもそもセキュアＯＳ部で秘密の処理を行う事を想定しておらず、ノンセキュアＯＳ部で秘密の処理を行う場合もあり得る。ノンセキュアＯＳ部は二次記憶装置に格納される事が一般的であるため、情報処理装置を一旦停止させ、二次記憶装置を物理的に抜き出してノンセキュアＯＳ部を改変したのち、情報処理装置を起動させるような攻撃が想定される。本実施形態では、これらの攻撃に対して、対応を可能とするものである。
【００１１】
この情報処理装置１００は、メインプロセッサ部１０１、アドレス空間制御部１０２、メモリ制御部１０３、メインメモリ部１０４、ブートＲＯＭ部１０５、二次記憶部制御部１０６、二次記憶部１０７、ブリッジ部１０８、及びＩ／Ｏ処理部１０９を備えている。メインプロセッサ部１０１、ブートＲＯＭ部１０５、アドレス空間制御部１０２、二次記憶部制御部１０６、及びブリッジ部１０８はバス１によって接続されている。また、Ｉ／Ｏ処理部１０９はブリッジ部１０８とバス２によって接続されている。
【００１２】
メインプロセッサ部１０１は、メインメモリ部１０４からロードした命令やデータを逐次的に処理し、処理した結果をメインメモリ部１０４に記憶させる。このメインプロセッサ部１０１は、たとえばＡＲＭ（登録商標）Ｃｏｒｔｅｘ―Ａシリーズのような汎用のプロセッサである。このメインプロセッサ部１０１は、少なくともセキュアモードとノンセキュアモードの二つの状態を持ち、メインプロセッサ部１０１の動作状態は、セキュアモードとノンセキュアモードとに選択的に切り替えられる。すなわち、メインプロセッサ部１０１の動作用ソフトウェアは、必要に応じてセキュアモードとノンセキュアモードとを交互に切り替えながらプログラムを実行する。さらに、メインプロセッサ部１０１は、現在どちらの状態にあるかを示す少なくとも１ビットの状態情報をバス１に送信している（状態送信部）。すなわち、バス１に接続される各モジュールはバス１に送信されている状態情報を監視する事によってメインプロセッサ部１０１がどちらのモードにあるかを識別することができる。このモードを選択的に切り替えて実行する方法として、たとえばＡＲＭプロセッサのセキュリティ機能であるＴｒｕｓｔＺｏｎｅ（登録商標）機能を利用すればよい。
【００１３】
メインメモリ部１０４は汎用の主記憶装置である。例えばＤＲＡＭ（Ｄｙｎａｍｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ)やＭＲＡＭ（Ｍａｇｎｅｔｉｃ  ＲＡＭ)を用いることができる。メモリ制御部１０３はメインプロセッサ部１０１からの指示に基づいてメインメモリ部１０４に対するリード・ライト命令及び対象データを受信したり、メインメモリ部１０４のリフレッシュなどを制御したりする。メインメモリ部１０４がＤＲＡＭの場合、たとえばＤＲＡＭコントローラを想定している。
【００１４】
アドレス空間制御部１０２は、メインプロセッサ部１０１からメモリ制御部１０３へのアクセスを監視し、アドレス範囲ごとにアクセス制御を行う。たとえば、メインプロセッサ部１０１は、メインプロセッサ部１０１がセキュアモードの状態にある時のみメインメモリ部１０４の特定のアドレス領域に対してアクセスが可能であり、ノンセキュアの状態にある時にはアクセスを許可しないといった設定をあらかじめ行う。メインプロセッサ部１０１からその指定した特定の領域へのアクセスがあった場合に、アドレス空間制御部１０２はバス１に流れる状態からプロセッサがセキュアモードかノンセキュアモードであるかを識別する。そして、アドレス空間制御部１０２はプロセッサがセキュアモードにあるならばアクセスを許可し、そうでない場合はアクセスを許可せず例外信号(フォールト信号またはアボート信号)を割り込み信号としてメインプロセッサ部１０１に送信する。アドレス空間制御部１０２がメインメモリ部１０４の領域を設定する方法については後述する。
【００１５】
ブートＲＯＭ部１０５は、情報処理装置１００がブート(起動)する際のプログラムコードを格納しておく。情報処理装置１００はブートすると、まずこのブートＲＯＭ部１０５からプログラムを呼び出し実行を開始する。ブートＲＯＭ部１０５はＲＯＭ(Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ)であるため、出荷時に書きこまれた内容を書き換える事はできない。
【００１６】
二次記憶部１０７はメインメモリ部１０４よりも大容量な不揮発性のメモリである。たとえば磁気ディスクやフラッシュメモリを用いることができる。二次記憶部制御部１０６は、メインプロセッサ部１０１からの指示に基づいて二次記憶部１０７に対するリード・ライト命令及び対象データを受信し、二次記憶部１０７にデータをリード・ライトの制御を行う。二次記憶部１０７がフラッシュメモリの場合、たとえばフラッシュメモリコントローラを想定している。
【００１７】
ブリッジ部１０８はバス１とバス２を接続するブリッジコントローラである。バス１はたとえばＡＸＩ（Ａｄｖａｎｃｅｄ  ｅＸｔｅｎｓｉｂｌｅ  Ｉｎｔｅｒｆａｃｅ)仕様を想定し、バス２はたとえばＡＰＢ(Ａｄｖａｎｃｅｄ  Ｐｅｒｉｐｈｅｒａｌ  Ｂｕｓ)規格に準拠したものを想定している。
【００１８】
Ｉ／Ｏ処理部１０９はマウスやキーボードなどの入出力デバイスと接続し、それらの入出力デバイスを制御する。キーボードやマウスからの入力があった場合にはブリッジ部１０８を介して割り込み信号としてメインプロセッサ部１０１に送信する。
【００１９】
図２はメインプロセッサ部１０１で動作するソフトウェアの構成の一例を示している。図２に示されるように、ソフトウェアとしては、セキュアモニタ部２００、セキュアＯＳ部３００、ブートローダ部４００、ノンセキュアＯＳ部５００を備えている。なお、ハードウェアであるアドレス空間制御部１０２、二次記憶部制御部１０６も記載しているが、本質的にはこの図面はソフトウェア構成を示すものである。
【００２０】
メインプロセッサ部１０１はセキュアモードとノンセキュアモードの二つの状態を選択的に切り替えながらソフトウェアを実行するが、セキュアモードで動作するＯＳ(Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ)がセキュアＯＳ部３００であり、ノンセキュアモードで動作するＯＳがノンセキュアＯＳ部５００である。
【００２１】
セキュアモニタ部２００はセキュアＯＳ部３００とノンセキュアＯＳ部５００を切り替える処理を行う。セキュアモニタ部２００はまた起動時にセキュアＯＳ部３００をロードして実行する処理も行う。セキュアＯＳ部３００はセキュアモードで動作させるためのＯＳである。
【００２２】
ノンセキュアＯＳ部５００はノンセキュアモードで動作させるためのＯＳである。ノンセキュアＯＳ部５００は、たとえばＬｉｎｕｘ（登録商標）のような汎用のオペレーティングシステムを想定している。ブートローダ部４００はノンセキュアＯＳ部５００を二次記憶部１０７から読み込み、メインメモリ部１０４に展開して実行を開始する。ブートローダ部４００はノンセキュアモードで実行することを想定している。
【００２３】
セキュアモニタ部２００は、ローダー部２０１と、ＯＳ切替部２０２と、セキュアモニタメモリ設定部２０３を含んでいる。ローダー部２０１は、二次記憶部１０７、又はブートＲＯＭ部１０５にファイルとして格納されているセキュアＯＳ部３００をロードして実行する処理を行う。
【００２４】
ＯＳ切替部２０２はメインプロセッサ部１０１の動作状態をセキュアモードとノンセキュアモードとに選択的に切り替える処理を行う。切り替えるタイミングとしては、セキュアＯＳ部３００、又はノンセキュアＯＳ部５００から明示的な切り替え命令を実行した時、タイマーや外部モジュールからの割り込み信号を受信した時などがある。セキュアＯＳ部３００が明示的な切り替え命令を実行した場合は、メインプロセッサ部１０１はセキュアＯＳ部３００からセキュアモニタ部２００のＯＳ切替部２０２に処理を遷移させる。そして処理をノンセキュアＯＳ部５００に切り替える。
【００２５】
ノンセキュアＯＳ部５００から明示的な切り替え命令を受信した場合は、メインプロセッサ部１０１はノンセキュアＯＳ部５００からセキュアモニタ部２００のＯＳ切替部２０２に処理を遷移させて処理をセキュアＯＳ部３００に切り替える。ＯＳ切替部２０２は、この切り替えの際、切り替え前のＯＳが元の状態に復帰できるように切り替え前のＯＳの状態(コンテキスト)をメインメモリ部１０４に保存しておく処理も行う。たとえば、ノンセキュアＯＳ部５００からセキュアＯＳ部３００に切り替える場合、ＯＳ切替部２０２はノンセキュアＯＳ部５００が利用中のレジスタの値、すなわちコンテキストを、セキュアモニタ部２００が管理する所定のメモリ領域に退避させ、セキュアＯＳ部３００を実行する。
【００２６】
ＯＳ切替部２０２は、セキュアＯＳ部３００からノンセキュアＯＳ部５００に切り替える際には退避しておいたノンセキュアＯＳ部５００のコンテキストをレジスタに復帰させる。同様に、セキュアＯＳ部３００からノンセキュアＯＳ部５００に切り替える際もコンテキストの退避と復帰の処理を行う。なお、セキュアＯＳ部３００からノンセキュアＯＳ部５００に遷移させる際、ノンセキュアＯＳ部５００に遷移した後にノンセキュアＯＳ部５００からレジスタの値を見る事によりセキュアＯＳ部３００で実行していた状態が読まれてしまう事を防ぐため、ＯＳ切替部２０２は、セキュアＯＳ部３００が利用していたレジスタの値をクリアすることが望ましい。
【００２７】
なお、タイマーや外部モジュールからの割り込み信号でモードを切り替える場合には、あらかじめＯＳ切替部２０２に対してどちらのモードに遷移させるのかを指示しておく。たとえば、アドレス空間制御部１０２から例外信号が送信されてきた場合、メインプロセッサ部１０１がセキュアモードの状態にある時にはセキュアＯＳ部３００の割り込みハンドラを実行し、ノンセキュアモードの状態にある時には強制的に状態を切り替えてセキュアＯＳ部３００の割り込みハンドラを実行するといった処理を行う。
【００２８】
セキュアモニタメモリ設定部２０３はメインメモリ部１０４に対して領域を設定し、各領域に対してアクセス制御の設定を行う。
【００２９】
図３は、セキュアモニタメモリ設定部２０３がメインメモリ部１０４のメモリ領域を区分けした一例を示している。この区分けの設定は、セキュアモニタメモリ設定部２０３によって機器起動時の処理の一部としてなされる。すなわち、メインメモリ部１０４のメモリ領域には、ノンセキュア領域１２１とセキュア領域１２２と共有領域１２３とが設定される。セキュア領域１２２には、セキュアＯＳ（セキュアＯＳのＯＳ実行イメージ）、セキュアＯＳ用データ、メモリエリア設定レジスタ、セキュアモニタ（セキュアモニタのＯＳ実行イメージ）、及びセキュアモニタ用データ等が格納される。また、共有領域１２３には、セキュアモードとノンセキュアモードの両方からアクセスする必要のあるデータが格納される。さらに、ノンセキュア領域１２１には、ノンセキュアＯＳ部５００（ノンセキュアＯＳのＯＳ実行イメージ）及びノンセキュアＯＳ部５００用データ、ブートローダ（ブートローダのＯＳ実行イメージ）等が格納される。ＯＳ用データとはＯＳが使う様々なデータ(コンテキストを含む)である。各領域の隙間の部分は明示的に説明がない限り、ノンセキュア領域１２１とする。ＯＳ実行イメージは、ＯＳを実行するためのバイナリーイメージをいう。
【００３０】
図４は、メインメモリ部１０４の各メモリ領域に対するアクセスの可否のポリシーを示している。このアクセス制御の設定は、セキュアモニタメモリ設定部２０３によって情報処理装置１００の起動時の処理の一部としてなされる。図４の場合、メインプロセッサ部１０１は、セキュアモードにある場合、メインプロセッサ部１０１で動作するソフトウェアがメインメモリ部１０４のセキュア領域１２２、共有領域１２３、及びノンセキュア領域１２１に全てアクセスが可能である。つまり、セキュアＯＳ部３００は、メインメモリ部１０４のセキュア領域１２２、共有領域１２３及びノンセキュア領域１２１に全てアクセスが可能である。
【００３１】
また、メインプロセッサ部１０１は、ノンセキュアモードにある場合、メインメモリ部１０４のセキュア領域１２２にアクセスが不可であり、共有領域１２３及びノンセキュア領域１２１にはアクセスが可能である。つまり、ノンセキュアＯＳ部５００は、メインメモリ部１０４のセキュア領域１２２にアクセスが不可であり、共有領域１２３及びノンセキュア領域１２１にはアクセスが可能である。なお、アクセスとは、メインメモリ部１０４に対して書き込みや読み出しを行なうことである。
【００３２】
このようなメインメモリ部１０４に対するアクセス制御は、以下の処理により実現される。すなわち、まずアドレス空間制御部１０２がメインプロセッサ部１０１からメインプロセッサ部１０１がセキュアモードであるかノンセキュアモードであるかを示す信号を受信する。そして、アドレス空間制御部１０２は、その信号からメインプロセッサ部１０１の状態を把握して、メインプロセッサ部１０１からメインメモリ部１０４にアクセスがあった場合、どのメモリエリアにアクセスが可能であるかを判別する。
【００３３】
続いて、図２に示されるように、セキュアＯＳ部３００は、仮想ＴＰＭ部３１０（Trusted  Platform  Module）、ハッシュ計算部３２０、メモリリード部３３０、メモリライト部３４０、遷移命令呼び出し部３５０、期待値格納部３６０、ハッシュ値検証部３７０、及びハッシュ値送信部３８０を備えている。なお、ハッシュ値送信部３８０は設けないでおくことも可能である。
【００３４】
仮想ＴＰＭ部３１０は、さらにハッシュ値格納部３１１、署名計算部３１２、秘密鍵格納部３１３を備えている。なお、署名計算部３１２、及び秘密鍵格納部３１３は設けないでおくことも可能である。
【００３５】
ハッシュ値格納部３１１は複数のハッシュ値を格納する。ハッシュ値格納部３１１はハッシュ計算部３２０によって計算された入力値と、もともとハッシュ値格納部３１１に格納されている値を使い、以下の式に従って計算した値をハッシュ値格納部３１１に格納する。ここで、ｆはハッシュ関数を示す。ハッシュ関数としては、たとえばＳＨＡ１やＳＨＡ―２５６、ＳＨＡ３やＭＤ５などよく知られたハッシュアルゴリズムを用いればよい。また、｜｜は結合(コンカチネート)の計算を示す。もともとハッシュ値格納部３１１に格納されている値の初期値、すなわちこの関数を初めて実行する時には値が０であるものとして計算する。ハッシュ値格納部３１１は格納している値を少なくとも情報処理装置１００がシャットダウンするまで記憶しておく。
【００３６】
新たにハッシュ値格納部３１１に格納する値＝ｆ(入力値｜｜もともとハッシュ値格納部３１１に格納されている値)
【００３７】
さらに、ハッシュ値格納部３１１は任意の値をハッシュ値格納部３１１に設定するインターフェースを持たない。たとえば、入力値を初めて設定すると以下のような計算がなされる。
【００３８】
新たにハッシュ値格納部３１１に格納する値＝ｆ(入力値｜｜０)
【００３９】
ハッシュ値格納部３１１に格納する値は上記値となるが、ここで関数ｆを通さず入力値を直接ハッシュ値格納部３１１に設定することはできない。
【００４０】
秘密鍵格納部３１３は、署名計算部３１２で利用する秘密鍵を格納する。仮想ＴＰＭ部３１０は、公開鍵と秘密鍵を生成し、秘密鍵格納部３１３に秘密鍵を格納する。なお、秘密鍵はセキュアモニタ部２００、又はセキュアＯＳ部３００以外のソフトウェアがリードできないような不揮発性メモリに格納しておく事が望ましい。もちろん、秘密鍵格納部３１３はセキュアモニタ部２００、又はセキュアＯＳ部３００以外のソフトウェアがリード、及びライトができないようになっていてもよい。また、情報処理装置１００を製造する際、あらかじめ公開鍵ペアを計算しておき、秘密鍵の値をブートＲＯＭ部１０５に格納しておいてもよい。いずれにしろ、秘密鍵格納部３１３に格納されている鍵は確率的に情報処理装置１００に固有の値である事が望ましい。
【００４１】
署名計算部３１２は、秘密鍵格納部３１３に格納されている秘密鍵を使い、ハッシュ値格納部３１１に格納されている値に対して署名計算を行いその結果を出力する。署名計算に用いる公開鍵アルゴリズムとしては、たとえばＲＳＡやＤＳＡ、ＥＣＤＳＡなどのアルゴリズムを用いればよい。
【００４２】
メモリリード部３３０はメインメモリ部１０４に格納されたデータをロード(リード)する。このロードの処理はアドレス空間制御部１０２を介して行われる。メモリライト部３４０はデータをメインメモリ部１０４にストア(ライト)する。このストアの処理はアドレス空間制御部１０２を介して行われる。
【００４３】
ハッシュ計算部３２０はメモリリード部３３０でリードしたデータに対するハッシュ値を計算し、仮想ＴＰＭ部３１０のハッシュ値格納部３１１に格納する処理を行う。このハッシュ関数としては、たとえばＳＨＡ１やＳＨＡ―２５６、ＳＨＡ３やＭＤ５などよく知られたハッシュアルゴリズムを用いればよい。
【００４４】
ハッシュ値検証部３７０は、ハッシュ値格納部３１１に格納されている値と、期待値格納部３６０に格納されている値が一致するか、比較処理を行う。期待値格納部３６０は、ハッシュ値検証部３７０で一致検査処理を行うための値を格納しておく。この期待値格納部３６０には、情報処理装置１００の製造時にノンセキュアＯＳ部５００のイメージを上述の数式に従ってあらかじめ計算しておいた値を格納しておくか、セキュアモニタ部２００、又はセキュアＯＳ部３００が情報処理装置１００のブートに先立ちあらかじめ計算しておいた値を格納しておく。すなわち、ノンセキュアＯＳ部５００が改ざんされることなく起動された場合のハッシュ値は、この期待値格納部３６０に格納された値と一致するようになる。なお、期待値格納部３６０に格納される値は、セキュアモニタ部２００、又はセキュアＯＳ部３００以外のソフトウェアがライトできないような不揮発性メモリに格納しておく事が望ましい。もちろん、工場出荷時に書きこむ場合は、以後ライトができないようにＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）の構成になっていてもよい。
【００４５】
遷移命令呼び出し部３５０は、メインプロセッサ部１０１のモードをセキュアモードからノンセキュアモードに遷移させる命令を実行する処理を行う。この命令が実行されると、メインプロセッサ部１０１はセキュアモニタ部２００のＯＳ切替部２０２に処理を遷移させる。
【００４６】
ハッシュ値送信部３８０は、仮想ＴＰＭ部３１０のハッシュ値格納部３１１に格納されている値に対して秘密鍵格納部３１３に格納されている秘密鍵を使い、署名計算部３１２で署名を生成するよう仮想ＴＰＭ部３１０に依頼し、仮想ＴＰＭ部３１０から署名済みハッシュ値を取得する処理を行う。
【００４７】
ブートローダ部４００は、起動部４０１、メモリライト部４０２、ＯＳリード部４０３、遷移命令呼び出し部４０４を備えている。ＯＳリード部４０３は、二次記憶部１０７からノンセキュアＯＳ部５００を読み込む処理を行う。
【００４８】
メモリライト部４０２は、ＯＳリード部４０３で読み込んだノンセキュアＯＳ部５００をメインメモリ部１０４に書きこむ処理を行う。なお、この書きこむ処理とは、アドレス空間制御部１０２に対して書きこみ命令と書きこみ対象のデータを送信する処理のことを指す。アドレス空間制御部１０２がメインメモリ部１０４にデータを書きこむ処理の可否判断を行い、メモリ制御部１０３が実際にメインメモリ部１０４にデータを書きこむ処理を行うため、メモリライト部４０２がメインメモリ部１０４にデータを書きこむ処理を行う訳ではない。
【００４９】
起動部４０１は、メインメモリ部１０４にノンセキュアＯＳ部５００の書き込みが完了した場合に、ノンセキュアＯＳ部５００の実行を開始する処理を行う。遷移命令呼び出し部４０４は、セキュアモニタ部２００のＯＳ切替部２０２に対してＯＳ遷移命令を送信する。なお、このＯＳ遷移命令はセキュアＯＳ部３００に対して遷移後の処理を指示する少なくとも１ビットの情報を伝えるパラメタを持つ。このパラメタの要素として、セキュアＯＳ部３００に対してＯＳ遷移後にメモリリードを行うのか、ハッシュ値の検証を行うのか伝える。このパラメタについては後述する。また、ＯＳ遷移後にメモリリードを指示する場合、メインメモリ部１０４のどのアドレスにライトしたのかを伝えるアドレスデータをセキュアＯＳ部３００に伝えるパラメタを合わせて伝えてもよい。
【００５０】
図５は、情報処理装置１００で、電源投入からノンセキュアＯＳ部５００を起動させるまでの処理を示すフロー図である。まず、電源が投入されると、ブートＲＯＭ部１０５に格納されたプログラムが実行される（ステップＳ１０１）。この状態ではメインプロセッサ部１０１はセキュアモードの状態にある。次いで、ブートＲＯＭ部１０５から起動されるプログラムによって、セキュアモニタ部２００が二次記憶部１０７から読み込まれ、メインメモリ部１０４に書きこまれることで、起動される（ステップＳ１０２）。セキュアモニタ部２００が起動されると、セキュアモニタ部２００のセキュアモニタメモリ設定部２０３がメインメモリ部１０４のメモリ領域のアクセス制御設定を行う。具体的には、図３に示したようにメインメモリ部１０４の領域を分割し、図４に示したようなアクセス制御を設定する処理である。
【００５１】
次にセキュアモニタ部２００はセキュアＯＳ部３００を二次記憶部１０７から読み込み、メインメモリ部１０４に書きこんでセキュアＯＳ部３００を起動する（ステップＳ１０３）。セキュアＯＳ部３００は初期化処理を実行すると、遷移命令呼び出し部３５０で、セキュアＯＳ部３００のＯＳ切り替え命令を実行する。すると、メインプロセッサ部１０１は処理をセキュアモニタ部２００のＯＳ切替部２０２に遷移させる。ＯＳ切替部２０２はコンテキストの退避・復帰処理とモードの切り替え処理を行う。この時点でメインプロセッサ部１０１はノンセキュアモードの状態になる。
【００５２】
そして、メインプロセッサ部１０１は、ブートローダ部４００を実行する（ステップＳ１０４）。このブートローダ部４００の実行は、セキュアモニタ部２００がブートＲＯＭ部１０５に格納されたプログラムを読み込んで、メインメモリ部１０４に書きこんで実行し、そのブートＲＯＭ部１０５に格納されたプログラムが二次記憶部１０７からブートローダ部４００を読み込み、メインメモリ部１０４に書きこんで実行させてもよい。また、セキュアモニタ部２００がメインプロセッサ部１０１の状態をノンセキュアモードに遷移させた後、セキュアモニタ部２００が二次記憶部１０７からブートローダ部４００を読み込み、メインメモリ部１０４に書きこんで実行させてもよい。
【００５３】
次に、ブートローダ部４００はノンセキュアＯＳ部５００のディスクイメージを二次記憶部１０７から読み込み、メインメモリ部１０４の共有領域１２３に書きこむ（ステップＳ１０５）。ノンセキュアＯＳ部５００はＬｉｎｕｘ（登録商標）のような比較的イメージサイズの大きいソフトウェアを想定している。このため、１命令でノンセキュアＯＳ部５００全体を二次記憶部１０７からメインメモリ部１０４の共有領域１２３に読み込む事はできない。ブートローダ部４００は二次記憶部１０７からノンセキュアＯＳ部５００の一部分(データＡと呼ぶ)を読み込み、メインメモリ部１０４の共有領域１２３にデータＡを書きこむと、遷移命令呼び出し部４０４を利用してＯＳ間遷移の命令を実行する（ステップＳ１０６）。この時、セキュアＯＳ部３００に処理が遷移した後に、セキュアＯＳ部３００がメモリリードを行う事を示す情報、及びブートローダ部４００はメインメモリ部１０４のどのアドレスにデータＡを書きこんだのかを示す情報(たとえば、データＡの開始アドレスとデータ長)をパラメタとしてつける。
【００５４】
セキュアモニタ部２００のＯＳ切替部２０２によってＯＳ間遷移がなされると、セキュアＯＳ部３００はパラメタをチェックする。セキュアＯＳ部３００はパラメタからメモリリードが実行された事を認識する。さらにセキュアＯＳ部３００はデータＡが書きこまれているメインメモリ部１０４の共有領域１２３のアドレスとデータＡの長さに関する情報を取得する。そして、セキュアＯＳ部３００はメモリリード部３３０を通じてデータＡをメインメモリ部１０４の共有領域１２３から取得して、ハッシュ計算部３２０でデータＡのハッシュ値を計算し、その値を仮想ＴＰＭ部３１０のハッシュ値格納部３１１に格納する（ステップＳ１０７）。
【００５５】
そして、メモリリード部３３０とメモリライト部３４０は、ノンセキュアＯＳ部５００のデータＡをメインメモリ部１０４の共有領域１２３からノンセキュア領域１２１にコピーする（ステップＳ１０８）。すなわち、これによりメインメモリ部１０４のノンセキュア領域１２１に書かれているデータはハッシュ計算部３２０によってハッシュ計算が完了したデータとなるようにすることができる。そして、セキュアＯＳ部３００は遷移命令呼び出し部３５０でＯＳ遷移命令を実行する（ステップＳ１０９）。
【００５６】
セキュアモニタ部２００のＯＳ切替部２０２によってＯＳ間遷移がなされると、ブートローダ部４００は全てのノンセキュアＯＳ部５００のデータのイメージの読み込みが完了したか否かを判定する（ステップＳ１１０）。読み込みが完了していないと判定された場合（ステップＳ１１０：Ｎｏ）、ブートローダ部４００は、二次記憶部１０７からノンセキュアＯＳ部５００の残りの一部分(データＢと呼ぶ)を読み込み、ステップＳ１０５からの処理を繰り返す。
【００５７】
ブートローダ部４００がノンセキュアＯＳ部５００のイメージ全体を二次記憶部１０７から読み込まれたと判定されると（ステップＳ１１０：Ｙｅｓ）、ブートローダ部４００は遷移命令呼び出し部４０４を利用してＯＳ間遷移の命令を実行する（ステップＳ１１１）。これは、すなわち、ノンセキュアＯＳ部５００全体がメインメモリ部１０４のノンセキュア領域１２１にライトされ、かつそのハッシュ値が仮想ＴＰＭ部３１０のハッシュ値格納部３１１に格納されたか否かの判定である。この時、セキュアＯＳ部３００に処理が遷移した後に、セキュアＯＳ部３００がハッシュ値の検証を行う事を示す情報をパラメタとして付ける。
【００５８】
セキュアモニタ部２００のＯＳ切替部２０２によってＯＳ間遷移がなされると、セキュアＯＳ部３００はパラメタをチェックする。セキュアＯＳ部３００はパラメタからハッシュ値の検証を実行する事を認識する。そして、セキュアＯＳ部３００は、ハッシュ値検証部３７０を通じて、ハッシュ値格納部３１１に格納された値と、期待値格納部３６０に格納された値とをチェックし（ステップＳ１１２）、一致するか否かを判定する（ステップＳ１１３）。
【００５９】
期待値とハッシュ値が一致する場合（ステップＳ１１３：Ｙｅｓ）、セキュアＯＳ部３００は遷移命令呼び出し部３５０でＯＳ遷移命令を実行する。セキュアモニタ部２００のＯＳ切替部２０２によってＯＳ間遷移がなされると、ブートローダ部４００はメインメモリ部１０４のノンセキュアＯＳ部５００用のノンセキュア領域１２１に書かれているノンセキュアＯＳ部５００の実行を開始し、起動させる（ステップＳ１１４）。一方、ハッシュ値と、期待値とが一致しないと判定された場合（ステップＳ１１３：Ｎｏ）、メインプロセッサ部１０１は、エラー処理を行う（ステップＳ１１５）。
【００６０】
なお、エラー処理として、システムを停止させる方法、情報処理装置１００に接続されている表示画面(不図示)に検証処理が失敗したことを伝えるメッセージを表示させる方法、成功した時と同様に遷移命令呼び出し部３５０でＯＳ遷移命令を実行し、ノンセキュアＯＳ部５００を実行させる方法がある。
【００６１】
ここで、期待値格納部３６０に格納してある値とブート時に計算したハッシュ値を一致させるには、期待値格納部３６０に格納してある値を計算する時のデータＡやデータＢのデータサイズと、セキュアＯＳ部３００のハッシュ計算部３２０の計算に使ったデータＡやデータＢのデータサイズは同じでなければならない。
【００６２】
以上のように本実施形態の情報処理装置１００にあっては、二次記憶部１０７に格納されたノンセキュアＯＳ部５００が、あらかじめ計算しておいたノンセキュアＯＳ部５００のイメージである事を確認することができる。したがって、仮にノンセキュアＯＳ部５００の改ざんがあった場合に、これを検出することができるようになる。これは特に二次記憶部１０７としてＨＤＤやＳＳＤのように汎用のインターフェースを持った装置を使い、二次記憶部１０７を物理的に着脱させることで二次記憶部１０７のデータを容易に書き換える事が可能な場合に特に有用である。
【００６３】
ノンセキュアＯＳ部５００は情報処理装置１００を稼働させておく上で必要な様々な処理を行う。もし、二次記憶部１０７のデータが不正な攻撃者によって書き換えられてしまうと、利用者又はシステム管理者の予期しない動作を引き起こすおそれがある。たとえば、情報処理装置１００のノンセキュアＯＳ部５００でＤＲＭ（Ｄｉｇｉｔａｌ  Ｒｉｇｈｔｓ  Ｍａｎａｇｅｍｅｎｔ）に関する判定処理(たとえば、コンテンツを再生して良いかどうかの判定処理)を行っていたとする。この時、攻撃者は本来コンテンツの再生が許可されていない状態であったとしても、常に再生できるように判定処理をスキップさせるようにノンセキュアＯＳ部５００を改変するかもしれない。これを防止するには、情報処理装置１００の実装者が意図したノンセキュアＯＳ部５００が実行されていることを、ノンセキュアＯＳ部５００の実行前に確認する必要がある。この実施形態では、あらかじめノンセキュアＯＳ部５００のハッシュ値を計算しておき、ノンセキュアＯＳ部５００を実行する前に、二次記憶部１０７からリードしたノンセキュアＯＳ部５００のイメージのハッシュ値を計算し、その値が一致するかどうかをノンセキュアＯＳ部５００の実行前に検査する事ができる。したがって、ハッシュ値が一致しない場合には、表示画面にエラーが表示されるようにすることなどによって、実装者がノンセキュアＯＳ部５００の実行前に改変を検知することができるようになる。
【００６４】
さらに、本実施形態では、検証処理に要するオーバーヘッドを極力削減して実現することが期待できる。一般的に二次記憶部１０７からの読み込み速度は、メインメモリ部１０４への書き込み、読み込み速度に比べて遅い。本実施形態において、ノンセキュアＯＳ部５００が二次記憶部１０７からデータのリードを要求して受信するまでの待ち時間の間に、ＯＳ間遷移とハッシュ値の計算を行うことができれば、検証処理を行わない場合と同等の時間でノンセキュアＯＳ部５００の検証処理を行うことができる。
【００６５】
（変形例１）
なお、仮にノンセキュアＯＳ部５００の検証処理が失敗したとしても、その失敗したという情報をノンセキュアＯＳ部５００等が知り得るのであれば、ノンセキュアＯＳ部５００のブート処理を継続する事が有用な場合もある。たとえば、上述のＤＲＭ処理の例では、情報処理装置１００上で保護対象のデータと非保護対象のデータ(権利フリーのコンテンツ)を再生する場合、非保護対象のデータを再生する際にはＤＲＭに関する計算処理を行う必要はなく、ＤＲＭに関する処理の部分が改変されていたとしても問題ない。また、必要に応じてノンセキュアＯＳ部５００が検証に成功しているか否かを確認することが有用な場合もある。
【００６６】
図６は、必要に応じてノンセキュアＯＳ部５００が検証に成功したか否かを確認する場合のメインプロセッサ部１０１で動作するソフトウェアの機能構成を示している。図６に示すように、情報処理装置１００は、コンテンツ配信サーバ７００と接続されている。コンテンツ配信サーバ７００は、インターネットなどのネットワークを経由して情報処理装置１００に対して映画や音楽などのコンテンツを配信する機能を持つ装置である。コンテンツを配信する際に、情報処理装置１００のノンセキュアＯＳ部５００が検証済であるか否かを検査し、検査が成功した場合のみコンテンツ配信サーバ７００は情報処理装置１００にコンテンツを配信するものとする。
【００６７】
情報処理装置１００のセキュアＯＳ部３００、セキュアモニタ部２００、ブートローダ部４００は図２と同様の構成である。ノンセキュアＯＳ部５００は通信処理部５０１、コンテンツ受信部５０２、ＤＲＭ処理部５０３、コンテンツ再生部５０４、ハッシュ値送信部５０５、及び遷移命令呼び出し部５１２を備えている。通信処理部５０１はコンテンツ配信サーバ７００と通信処理を行う。コンテンツ受信部５０２は、コンテンツ配信サーバ７００から送信されてくるコンテンツを受信する。コンテンツはＡＥＳ等の暗号アルゴリズムによって鍵を用いて暗号化されて配信されることを想定している。
【００６８】
ＤＲＭ処理部５０３は、コンテンツを復号するためのＤＲＭに関する鍵計算処理などを行う。ＤＲＭ処理部５０３は、コンテンツ配信サーバからダウンロードしたコンテンツ復号用暗号化鍵を入力し、ＤＲＭ処理部５０３に含まれる鍵を用いてコンテンツ復号用暗号化鍵を復号し、コンテンツ復号用鍵を計算によって求める処理を行う。コンテンツ再生部５０４は、ＤＲＭ処理部５０３にて計算したコンテンツ復号用鍵を使い、コンテンツ受信部５０２にて受信した暗号化コンテンツを復号し、再生処理を行う。ハッシュ値送信部５０５は、セキュアＯＳ部３００のハッシュ値送信部３８０が取得した、署名付きのノンセキュアＯＳ部５００のハッシュ値を取得し、コンテンツ配信サーバ７００に送信する。
【００６９】
まず、コンテンツ配信サーバ７００はコンテンツの配信に先立ち、署名付きのノンセキュアＯＳ部５００のハッシュ値を送信するよう情報処理装置１００へ依頼する。具体的には、ハッシュ値送信部５０５が遷移命令呼び出し部５１２に対してセキュアＯＳ部３００から署名付きのノンセキュアＯＳ部５００のハッシュ値を取得するよう依頼する。まず、遷移命令呼び出し部５１２は、ＯＳ切り替え命令を実行する。すると、メインプロセッサ部１０１は処理をセキュアモニタ部２００のＯＳ切替部２０２に遷移させる。ＯＳ切替部２０２はコンテキストの退避・復帰処理とモードの切り替え処理を行い、メインプロセッサ部１０１の状態をセキュアモードにし、セキュアＯＳ部３００のハッシュ値送信部３８０を実行する。ハッシュ値送信部３８０は仮想ＴＰＭ部３１０の署名計算部３１２に対して、秘密鍵格納部３１３に格納されている鍵を使い、ハッシュ値格納部３１１の値に対して署名付きハッシュ値を計算するよう依頼し、その結果を取得する。この結果が署名付きのノンセキュアＯＳ部５００のハッシュ値である。そして、その値をメインメモリ部１０４の共有領域１２３に書きこみ、遷移命令呼び出し部３５０を実行して、処理を再びノンセキュアＯＳ部５００に戻す。ノンセキュアＯＳ部５００のハッシュ値送信部５０５は共有領域１２３から署名付きのノンセキュアＯＳ部５００のハッシュ値を取得し、コンテンツ配信サーバ７００からの依頼に基づいてその値をコンテンツ配信サーバ７００へと送信する。コンテンツ配信サーバ７００はセキュアＯＳ部３００の仮想ＴＰＭ部３１０の秘密鍵格納部３１３に格納されている秘密鍵に対応する公開鍵を有している。この公開鍵を使い、コンテンツ配信サーバ７００はノンセキュアＯＳ部５００のハッシュ値を検証する。さらに、コンテンツ配信サーバ７００はハッシュ値がノンセキュアＯＳ部５００のハッシュ値の期待値と一致するか検証する。両方の検証が成功した場合に限り、コンテンツ配信サーバ７００は、コンテンツを情報処理装置１００に送信する。
【００７０】
このようにすることで、コンテンツ配信サーバ７００は期待するノンセキュアＯＳ部５００が情報処理装置１００で動作している時のみコンテンツを配信する事ができ、不正に改変された情報処理装置１００（ノンセキュアＯＳ部５００）に対してコンテンツを提供してしまう事でコンテンツが不正に利用されるという事を防止する事ができる。この場合は、ノンセキュアＯＳ部５００は、エラー処理がされずに、コンテンツ配信サーバ７００と連携した処理以外は通常通り稼動するようにしてもよい。
【００７１】
（変形例２）
図７は図５の別例である。図５では電源投入時にブートＲＯＭ部１０５に格納されたプログラムが二次記憶部１０７に格納されたセキュアモニタ部２００を実行した。図７に示すフローではまずブートＲＯＭ部１０５に格納されたブートローダ部４００が実行され、次にブートローダ部４００が二次記憶部１０７に格納されたセキュアモニタ部２００をロードして実行する（ステップＳ２０１）。その後は図５と同様の手順でセキュアＯＳ部３００を実行する。セキュアＯＳ部３００の起動処理が完了するとセキュアＯＳ部３００は遷移命令呼び出し部３５０によりＯＳ遷移命令を実行する。メインプロセッサ部１０１はセキュアモニタ部２００に処理を遷移させる。セキュアモニタ部２００はセキュアモードからノンセキュアモードに状態を遷移させ、ノンセキュアモードでブートローダ部４００を実行する（ステップＳ２０２）。その後の処理は図５と同一である。なお、ブートローダ部４００はブートＲＯＭ部１０５に格納されるため、二次記憶部１０７に格納されるデータのように外部から改変される恐れはない。このため、ブートローダ部４００は管理者が期待するものを確実に実行することができる。
【００７２】
図５ではセキュアモニタ部２００とブートローダ部４００それぞれにＯＳをロードして実行する機能を備える必要があった。図７のように構成することで、セキュアＯＳ部３００、ノンセキュアＯＳ部５００に限らずＯＳをロードして実行する汎用的な機能をブートローダ部４００に備えることができ、ＯＳをロードして実行する機能をブートローダ部４００のみに実装すれば済むため、開発コストを削減することができる。
【００７３】
（変形例３）
図８、及び図９は、メインメモリ部１０４の領域設定と、アクセスポリシーの別例を示している。図９に示されるように、メインメモリ部１０４は、セキュア領域Ａ１２２ａとセキュア領域Ｂ１２２ｂ、ノンセキュア領域１２１、共有領域１２３に区分されており、ノンセキュアモードがリードアクセスとライトアクセスに分けてアクセス権を設定している点が図４との違いである。なお、セキュアモードもリードとライトに分けてアクセス権を設定するように構成してもよいが、ここでは説明を簡単にするため、セキュアモードはリードとライト共通の設定になっているものとする。すなわち、セキュアモードでアクセス可と記されている部分はリードアクセスもライトアクセスも許可されているものとする。
【００７４】
すなわち、メインプロセッサ部１０１がセキュアモードの状態にある場合、メインプロセッサ部１０１で動作するソフトウェアがメインメモリ部１０４のセキュア領域Ａ１２２ａ、セキュア領域Ｂ１２２ｂ、共有領域１２３及びノンセキュア領域１２１に全てアクセスが可能である。つまり、セキュアＯＳ部３００は、メインメモリ部１０４のセキュア領域Ａ１２２ａ、セキュア領域Ｂ１２２ｂ、共有領域１２３及びノンセキュア領域１２１に全てリードとライトのアクセスが可能である。
【００７５】
また、メインプロセッサ部１０１は、ノンセキュアモードにある場合、メインメモリ部１０４のセキュア領域Ａ１２２ａについてはリードのアクセスもライトのアクセスも禁止される。一方、メインプロセッサ部１０１は、セキュア領域Ｂ１２２ｂについてはライトのアクセスは禁止であるがリードのアクセスは許可される。メインプロセッサ部１０１は、共有領域１２３及びノンセキュア領域１２１にはリードもライトもアクセスが可能である。つまり、ノンセキュアＯＳ部５００は、メインメモリ部１０４のセキュア領域Ａ１２２ａにリードもライトもアクセスが不可であり、セキュア領域Ｂ１２２ｂはリードのみ許可され、共有領域１２３及びノンセキュア領域１２１にはリードもライトもアクセスが可能である。
【００７６】
図９は、セキュアモニタメモリ設定部２０３がメインメモリ部１０４のメモリ領域を区分けした一例を示している。この区分けの設定は、セキュアモニタメモリ設定部２０３によって機器起動時の処理の一部としてなされる。すなわち、メインメモリ部１０４のメモリ領域には、セキュア領域Ａ１２２ａとセキュア領域Ｂ１２２ｂと共有領域１２３とノンセキュア領域１２１とが設定される。
【００７７】
セキュア領域Ａ１２２ａには、セキュアＯＳ（セキュアＯＳのＯＳ実行イメージ）、セキュアＯＳ用データ、メモリエリア設定レジスタ、セキュアモニタ（セキュアモニタのＯＳ実行イメージ）及びセキュアモニタ用データ等が格納される。また、セキュア領域Ｂ１２２ｂにはノンセキュアＯＳ（ノンセキュアＯＳのＯＳ実行イメージ）が格納される。また、共有領域１２３には、セキュアモードとノンセキュアモードの両方からアクセスする必要のあるデータが格納される。さらに、ノンセキュア領域１２１には、ノンセキュアＯＳ用データ等が格納される。
【００７８】
ノンセキュアＯＳ部５００はノンセキュアＯＳ部５００用のメモリ領域、すなわちセキュア領域Ｂ１２２ｂにライトされるが、このライトの処理はセキュアＯＳ部３００が行う必要がある。図８に示したアクセス制御のポリシーではセキュアモードでセキュア領域Ｂ１２２ｂにデータをライトする事は許可されている。セキュアＯＳ部３００はセキュアモードで実行されるため、このライトは成功することになる。
【００７９】
ノンセキュアＯＳ部５００を実行するにはブートローダ部４００及びノンセキュアＯＳ部５００自身がノンセキュアＯＳ部５００の設置されたメモリ領域であるセキュア領域Ｂ１２２ｂをリードする必要がある。図８で示したポリシー設定によりブートローダ部４００とノンセキュアＯＳ部５００はセキュア領域Ｂ１２２ｂのリードが許可されているため問題ない。一方、ノンセキュアＯＳ部５００からセキュア領域Ｂ１２２ｂへの書き込みは禁止されている。これは情報処理装置１００をブート後に、不正なプログラムによってノンセキュアＯＳ部５００のメモリ領域を改変するような攻撃を防止するためである。ノンセキュアＯＳ部５００にソフトウェアのバグなどが存在した場合、このバグを不正に利用してノンセキュアＯＳ部５００の処理を不正に改変する攻撃が一般的によく知られている。しかし、図８のような設定にしておけば、仮にノンセキュアＯＳ部５００のメモリ領域の変更、すなわちセキュア領域Ｂ１２２ｂに対する書き込みを試みたとしても、アドレス空間制御部１０２はノンセキュアモードでセキュア領域Ｂ１２２ｂに対する書きこみが行われた事を検出し、これをブロックするため、ノンセキュアＯＳ部５００を改変することはできない。
【００８０】
このように、セキュアモニタ部２００のセキュアモニタメモリ設定部２０３でアドレス空間制御部１０２を通じたメモリ制御のアクセス権を設定することで、ノンセキュアＯＳ部５００の実行を阻害せず、ノンセキュアＯＳ部５００が設置されているメインメモリ部１０４のデータを書き換えるような攻撃を防止する事が出来る。
【００８１】
図１０は、図２のソフトウェアの機能構成の別例を示す図である。図２に示した構成ではブートローダ部４００は二次記憶部１０７からノンセキュアＯＳ部５００の一部分を読み込むと、ブートローダ部４００が遷移命令呼び出し部４０４を利用して明示的にＯＳ間遷移の命令を実行しなければならなかった。図１０の構成では、このブートローダ部４００のＯＳ間遷移の明示的な呼び出しを省略することができる。なお、この変形例１では、メインメモリ部１０４のアクセス制御には、図８、図９で示した設定が用いられる。
【００８２】
図１０に示すとおり、セキュアモニタ部２００はモニタハンドラ部２０４と割り込み設定部２０５を、セキュアＯＳ部３００はアボートハンドラ部３９０を、それぞれ備えている。なお、図２と同様、ブートローダ部４００は遷移命令呼び出し部４０４を備えているが、これはノンセキュアＯＳ部５００の一部分を読み込んだ後に行うものではなく、ノンセキュアＯＳ部５００全体をメインメモリ部１０４に読み込んだ後のハッシュ値の検証をセキュアＯＳ部３００に依頼する時に呼び出すためにあるものである。すなわち、図５で示した、ステップＳ１０６の処理では、遷移命令呼び出し部４０４は処理を行わない。
【００８３】
割り込み設定部２０５は、メインプロセッサ部１０１がアドレス空間制御部１０２やタイマー割り込みなどの例外信号が発生した場合にモニタハンドラ部２０４を呼び出すようにメインプロセッサ部１０１に設定を施す。この設定処理はセキュアモニタ部２００の初期化処理時の一処理として実行される。
【００８４】
モニタハンドラ部２０４は、メインプロセッサ部１０１がアドレス空間制御部１０２で例外信号が発生した場合に呼び出される。モニタハンドラ部２０４はもし割り込みが発生した時点での状態がノンセキュアモードであるならばノンセキュアＯＳ部５００のコンテキストを保存し、状態をセキュアモードに切り替える処理を行う。その後、処理をアボートハンドラ部３９０に引き継ぐ。
【００８５】
アボートハンドラ部３９０は、モニタハンドラ部２０４から処理を引き継ぎ、メインメモリ部１０４からデータを読み込んだり、データのハッシュ値を仮想ＴＰＭ部３１０に蓄積したりする。
【００８６】
図１１は、図１０の構成における情報処理装置で、電源投入からノンセキュアＯＳ部５００を起動させるまでの処理を示すフロー図である。ブートローダ部４００をロードして実行するまでは図５と同様の処理を行う。なお、本実施形態ではセキュアモニタメモリ設定部２０３は、設定したメモリの領域で、アクセスのポリシー違反があった場合の処理についても設定する。
【００８７】
上述したようにアドレス空間制御部１０２は設定したポリシーに違反するアクセスがあった場合、そのアクセスを許可せず、例外信号を割り込み信号としてメインプロセッサ部１０１に送信する。このための設定として、セキュアモニタ部２００がロードされて実行されると（ステップＳ３０１）、割り込み設定部２０５は、この割り込み信号が発生した場合に、セキュアモニタ部２００のモニタハンドラ部２０４を実行するようにメインプロセッサ部１０１に設定を行う。この設定によって、セキュア領域Ｂ１２２ｂに対してノンセキュアモードからライトの要求があった場合、メインプロセッサ部１０１はノンセキュアＯＳ部５００の処理を強制的に中断し、メインプロセッサ部１０１の状態をセキュアモニタ部２００のモニタハンドラ部２０４に処理を遷移させる。
【００８８】
次に、セキュアモニタ部２００がセキュアＯＳ部３００をロードして実行し（ステップＳ１０３）、さらにブートローダ部４００をロードして起動する（ステップＳ１０４）までは図５と同様の処理を行えばよい。
【００８９】
そして、ブートローダ部４００はノンセキュアＯＳ部５００を二次記憶部１０７から読み込み、メモリライト部４０２でメインメモリ部１０４のセキュア領域Ｂ１２２ｂに書きこもうとする（ステップＳ３０２）。図５で示した、ステップＳ１０５と異なり、共有領域１２３ではなく、セキュア領域Ｂ１２２ｂに書き込もうとする。つまり、ブートローダ部４００は二次記憶部１０７からノンセキュアＯＳ部５００の一部分(データＡと呼ぶ)を読み込み、メインメモリ部１０４のセキュア領域Ｂ１２２ｂにデータＡを書きこもうとする。
【００９０】
この時、メインプロセッサ部１０１の状態はノンセキュアモードの状態である。図８に示したように、ノンセキュアモードではセキュア領域Ｂ１２２ｂへのライトが許可されていない。そこで、アドレス空間制御部１０２はメインプロセッサ部１０１に例外を発生させ、メインプロセッサ部１０１は上述の割り込み設定部２０５の設定に従いモニタハンドラ部２０４に処理を遷移させる。
【００９１】
モニタハンドラ部２０４はノンセキュアＯＳ部５００のコンテキストを保存する。この処理はＯＳ切替部２０２がノンセキュアＯＳ部５００からセキュアＯＳ部３００に遷移する際に行うコンテキスト保存の処理と同じように行えばよい。そしてメインプロセッサ部１０１の状態をノンセキュアモードからセキュアモードに遷移させ、最後にセキュアＯＳ部３００のアボートハンドラ部３９０を実行する。
【００９２】
セキュアＯＳ部３００のアボートハンドラ部３９０は例外が発生する直前の命令をメインメモリ部１０４から読み込む。例外が発生する直前の命令は、データＡをメインメモリ部１０４のノンセキュアＯＳ部５００用のセキュア領域Ｂ１２２ｂに書きこむ命令である。アボートハンドラ部３９０はこの書きこみ先のアドレス(アドレスＡと呼ぶ)とデータＡを取得し、ハッシュ計算部３２０を使ってデータＡのハッシュ値を計算し、そのハッシュ値を仮想ＴＰＭ部３１０のハッシュ値格納部３１１に格納する（ステップＳ３０３）。
【００９３】
そしてアボートハンドラ部３９０は、データＡをメモリライト部３４０を通じて、ノンセキュアＯＳ部５００用のセキュア領域Ｂ１２２ｂにおけるアドレスＡに書きこむ（ステップＳ３０４）。セキュアＯＳ部５００はセキュアモードで実行されるが、図８に示したようにセキュアモードからセキュア領域Ｂ１２２ｂへの書き込みは許可されているため、この書きこみは成功する。ステップＳ３０３とステップＳ３０４とは順番を入れ替えてもよい。
【００９４】
続いて、遷移命令呼び出し部３５０は、ＯＳ間遷移命令を実行してメインプロセッサ部１０１の状態をノンセキュアモードに切り替え、ノンセキュアＯＳ部５００が例外発生の直前に処理していた処理に戻す（ステップＳ３０５）。すなわち、ノンセキュアＯＳ部５００はメインメモリ部１０４のノンセキュアＯＳ部５００用のセキュア領域Ｂ１２２ｂに自らがデータＡを書きこんだかのようにふるまう。
【００９５】
次いで、セキュアＯＳ部３００によってノンセキュアＯＳ部５００のイメージ全体がメインメモリ部１０４のノンセキュアＯＳ部５００用のセキュア領域Ｂ１２２ｂにライトされたか否かをブートローダ部４００は判定する（ステップＳ３０６）。イメージ全体がライトされていないと判定された場合（ステップＳ３０６：Ｎｏ）、全てのイメージがライトされるまでステップＳ３０２からの処理を繰り返す。一方、イメージ全体がライトされていると判定された場合（ステップＳ３０６：Ｙｅｓ）、ブートローダ部４００は遷移命令呼び出し部４０４を利用してＯＳ間遷移の命令を実行する（ステップＳ１１１）。なお、図５とは異なり、ノンセキュアＯＳ部５００の遷移命令呼び出し部４０４はこの場合しか利用されない。図５ではパラメタによってセキュアＯＳ部３００に実行させる命令を区別していたが、命令を区別するためのパラメタは不要である。その後の処理は図５と同様の処理を行えばよい。
【００９６】
（変形例４）
続いて、図１２は、図１０で示した情報処理装置の別の構成を示すものである。図１０で示した構成の場合、ブートローダ部４００はノンセキュアＯＳ部５００のイメージ全体をメインメモリ部１０４のノンセキュアＯＳ部５００用のセキュア領域Ｂ１２２ｂに書きこんだ後、遷移命令呼び出し部４０４を使って明示的にセキュアＯＳ部に遷移させる必要があった。図１２は、この明示的な遷移を省略するものである。
【００９７】
図１２に示すとおり、セキュアＯＳ部３００のアボートハンドラ部３９０がハッシュ値検証部３７０と接続されている点、ブートローダ部４００に遷移命令呼び出し部４０４がない点が図１０とは異なる。アボートハンドラ部３９０は図１０の場合の処理に加えて、例外を起こした原因を識別し、メインメモリ部１０４へのデータ書き込み違反である場合にはハッシュ値検証部３７０を呼び出す処理を行う。
【００９８】
図１３に、図１２の構成におけるメインメモリ部１０４の各メモリ領域に対するアクセスの可否のポリシーを示す。なお、このアクセス制御の設定も、図８に示したのと同様にセキュアモニタメモリ設定部２０３によって機器起動時の処理の一部としてなされる。メインプロセッサ部１０１がノンセキュアモードにある場合で、リードアクセスがある場合、図８の場合ではリードアクセスは許可されていたが、図１３ではセキュア領域Ｂ’１２２ｂ’としてリードもライトも不可である点が図８との違いである。
【００９９】
図１４は図１２の構成における情報処理装置１００で、電源投入からノンセキュアＯＳ部５００を起動させるまでの処理を示すフロー図である。ブートローダ部４００がノンセキュアＯＳ部５００のイメージ全体をメインメモリ部１０４のノンセキュアＯＳ部５００領域に書きこみを完了させるまでは図１１と同様の処理を行えばよい。
【０１００】
ブートローダ部４００がノンセキュアＯＳ部５００のディスクイメージ全体をメインメモリ部１０４のノンセキュアＯＳ部５００領域に書きこんだことを検出すると（ステップＳ３０６：Ｙｅｓ）、ブートローダ部４００はノンセキュアＯＳ部５００を実行する（ステップＳ４０１）。この実行はノンセキュアＯＳ部５００用のデータが記憶されるセキュア領域Ｂ’１２２ｂ’のコード(データ)を読み込む処理である。ここで、アドレス空間制御部１０２のポリシーが図１３のように設定されている。すなわち、ブートローダ部４００はメインプロセッサ部１０１がノンセキュアモードの状態で動作しており、ノンセキュアＯＳ部５００のデータが記憶される領域はセキュア領域Ｂ’１２２ｂ’のポリシーとして設定されているため、このデータ読み込み処理はアドレス空間制御部１０２が許可せず、メインプロセッサ部１０１に例外を発生させる。メインプロセッサ部１０１は割り込み設定部２０５の設定に従いモニタハンドラ部２０４に処理を遷移させる。
【０１０１】
モニタハンドラ部２０４はノンセキュアＯＳ部５００のコンテキストを保存する。この処理はＯＳ切替部２０２がノンセキュアＯＳ部５００からセキュアＯＳ部３００に遷移する際に行うコンテキスト保存の処理と同じように行えばよい。そしてメインプロセッサ部１０１の状態をノンセキュアモードからセキュアモードに遷移させ、最後にセキュアＯＳ部３００のアボートハンドラ部３９０を実行する。
【０１０２】
セキュアＯＳ部３００のアボートハンドラ部３９０は例外が発生する直前の命令をメインメモリ部１０４から読み込む。例外が発生する直前の命令は、メインメモリ部１０４のノンセキュアＯＳ部５００用の領域であるセキュア領域Ｂ’１２２ｂ’からデータを読み込む命令である。この読み込み先のアドレス(アドレスＢと呼ぶ)を取得し、セキュア領域Ｂ’１２２ｂ’に属する事を確認する。もしセキュア領域Ｂ’１２２ｂ’に属さない場合はエラー処理を行い、以後の処理は行わない。セキュア領域Ｂ’１２２ｂ’に属する場合は、正常な動作であると判断し、セキュアＯＳ部３００はハッシュ値検証部３７０を使って、ハッシュ値格納部３１１に格納された値が、期待値格納部３６０に格納された値と一致するか否かをチェックする（ステップＳ１１２、ステップＳ１１３）。
【０１０３】
なお、ブートローダ部４００はノンセキュアＯＳ部５００を実行するため、ノンセキュアＯＳ部５００のメモリ領域であるセキュア領域Ｂ’１２２ｂ’のコード(データ)を読み込む処理を繰り返し行う。また、ノンセキュアＯＳ部５００のブート後もノンセキュアＯＳ部５００は自身の処理を行うため、必要に応じてノンセキュアＯＳ部５００領域からコードを読み込む処理を行う。このようにノンセキュアモードにおいて、ノンセキュアＯＳ部５００用のメモリの領域のリードアクセスは繰り返し発生するが、その都度、ハッシュ値の検証処理を行うのは冗長である。従って、期待値と一致すると判断した場合、ＯＳ間遷移でノンセキュアモードに戻る前に、ノンセキュアモードでノンセキュアＯＳ部５００用の領域へのリードが発生したとしても以後、例外を発生させないようにアドレス空間制御部１０２を設定するようにしてもよい。すなわち、アドレス空間制御部１０２のアクセス制御のポリシー設定を図１３の状態から図８の状態に変更するよう、アドレス空間制御部１０２に対して設定命令を送信してもよい。この設定はセキュアＯＳ部３００が行ってもよいし、セキュアモニタ部２００の割り込み設定部２０５に依頼し、割り込み設定部２０５が設定処理を行ってもよい。図８のポリシー設定であれば、ノンセキュアモードからのセキュア領域Ｂへのリードアクセスは許可されているため、ブートローダ部４００やノンセキュアＯＳ部５００がノンセキュアＯＳ部５００用のメモリの領域(セキュア領域Ｂ)にリードアクセスしたとしても例外は発生せず、セキュアＯＳ部３００のアボートハンドラ部３９０が実行されることもない。
【０１０４】
以上述べてきたように、図１４の構成ではブートローダ部４００が明示的にセキュアＯＳ部３００に遷移させる必要がなくなる。ブートローダ部４００からみると、一般的なシステムのブート手順に従ってノンセキュアＯＳ部５００を二次記憶部１０７から読み込んでメインメモリ部１０４にロードし、ノンセキュアＯＳ部５００を実行するだけの処理を行えばよいようになる。すなわち、本実施形態用にブートローダ部４００を修正する必要がなくなるため、機器の実装コストを省略することができる。
【０１０５】
（変形例５）
図１５は図１２の別例である。図１２に示した構成ではメインプロセッサ部１０１がシングルコアであることを想定していた。図１５はメインプロセッサ部１０１がマルチコアである場合の構成である。図１５に示すとおり、セキュアＯＳ部３００がコア設定部３９１を備えている点が図１２とは異なる。コア設定部３９１は、ハッシュ値検証部３７０による検証処理が完了するまで動作するコアを１つに制限し、検証処理が完了した後、残りのコアを動作させる処理を行う。
【０１０６】
図１６は、図１５の構成における情報処理装置１００で、電源投入からノンセキュアＯＳ部５００を起動させるまでの処理を示すフロー図である。セキュアモニタ部２００をロードして実行するまでは図１４と同様の処理を行えばよい。
【０１０７】
コア設定部３９１は、セキュアＯＳ部３００からＯＳ間遷移でノンセキュアモードに遷移する前に、メインプロセッサ部１０１に備わっているコア数をチェックする。もし、メインプロセッサ部１０１のコアが１である場合は以後の処理を行う必要はない。メインプロセッサ部１０１のコア数が２以上の場合、メインプロセッサ部１０１で動作中のコアが１であることを確認する。コア設定部３９１は、もし２つ以上のコアが動作中である場合は、動作中のコアを１つに制限する（ステップＳ１１７）。そしてノンセキュアモードに遷移してブートローダ部４００を実行する（ステップＳ１０４）。
【０１０８】
その後、ハッシュ値検証部３７０でノンセキュアＯＳ部５００領域に展開されたノンセキュアＯＳ部５００のイメージのハッシュ値と、期待値格納部３６０に格納された値とが一致するか否かを検証する処理を行うまで（ステップＳ１１３まで）は図１４と同様の処理を行えばよい。そしてハッシュ値が期待値と一定する場合（ステップＳ１１３：Ｙｅｓ）、コア設定部３９１は、制限した他のコアを有効化して（ステップＳ１１６）、ノンセキュアＯＳ部５００が起動する（ステップＳ１１４）。なお、ブートローダ部４００によって動作中のコア数が変更されてしまう事を防ぐために、動作コア数を設定するレジスタに対応したメインメモリ部１０４のメモリ領域をセキュア領域Ｂ、すなわちノンセキュアモードからのライトが禁止となっている領域に設定してもよい。また、ブートローダ部４００の実行中にノンセキュアモードからセキュアモードに遷移し、仮想ＴＰＭ部３１０のハッシュ値格納部３１１にデータを書きこむ前後に、ブートローダ部４００によって動作コア数が変更されていないかチェックする処理を行ってもよい。もし、ブートローダ部４００によってコア数が変更されてしまった場合には、システムを停止させるか、表示画面(不図示)にコア数が変更されたことを伝えるメッセージを表示させるかなどエラー処理を行う。
【０１０９】
（変形例６）
図１７は図１４の別例である。図１２に示した構成ではセキュアＯＳ部３００側でノンセキュアＯＳ部５００をメインメモリ部１０４に書きこむ処理を行っていた。図１７はブートローダ部４００でノンセキュアＯＳ部５００をメインメモリ部１０４に書きこむ事ができるが、検証対象となった領域はセキュアＯＳ部３００によってライト不可として設定される。
【０１１０】
図１７に示すとおり、セキュアＯＳ部３００によってノンセキュアＯＳ部５００のデータがメインメモリ部１０４に書きこまれるわけではないため、セキュアＯＳ部３００はメモリライト部を備えない。さらにハッシュ値格納部３１１にデータを格納する毎にアドレス空間制御部１０２のメモリ領域設定を変更するため、セキュアＯＳ部３００がメモリ設定部３９３、およびタイマー割り込みハンドラ部３９２を新たに備えている点が図１２とは異なる。
【０１１１】
メモリ設定部３９３は、セキュアモニタ部２００のセキュアモニタメモリ設定部２０３と同様に、アドレス空間制御部１０２に対して、アクセス制御のポリシーを設定する処理を行う。
【０１１２】
図１８は、図１７の構成における情報処理装置１００で、電源投入からノンセキュアＯＳ部５００を起動させるまでの処理を示すフロー図である。また、図１９にセキュアモニタメモリ設定部２０３がメインメモリ部１０４のメモリ領域を区分けした一例を示している。この区分けの設定は、セキュアモニタメモリ設定部２０３によって機器起動時の処理の一部としてなされる。初期状態ではノンセキュアＯＳ部５００に割り当てられている領域がノンセキュア領域１２１として設定されている。
【０１１３】
ところで、メインプロセッサ部１０１はある一定周期で時間が経過すると割り込みを検出する、いわゆるタイマー割り込みを検出する事ができる。これは、メインメモリ部１０４に対するアクセスでポリシー違反が発生した時にアドレス空間制御部１０２がメインプロセッサ部１０１に送信する例外と同様の仕組みで実現される。割り込み設定部２０５はタイマー割り込みが発生した場合、モニタハンドラ部２０４に処理を遷移させるようにアドレス空間制御部１０２を設定しておく。この設定は、セキュアモニタ部２００がロードされて起動した際に、割り込み設定部２０５によって機器起動時の処理の一部としてなされる（ステップＳ７０１）。
【０１１４】
ブートローダ部４００はノンセキュアＯＳ部５００の一部分を二次記憶部１０７から読み込み、メインメモリ部１０４のノンセキュアＯＳ部５００用のノンセキュア領域１２１に書きこむ。書き込みの処理はノンセキュアモードで動作するブートローダ部４００によってなされるが、図１９に示したようにノンセキュアＯＳ部５００が書きこまれる領域はノンセキュア領域１２１として設定されている。従って、アドレス空間制御部１０２はこの書きこみを許可し、実際にノンセキュアＯＳ部５００の一部がメインメモリ部１０４のノンセキュア領域１２１に書きこまれる。ブートローダ部４００はこの書きこみ処理を繰り返す。
【０１１５】
ここで、ブートローダの処理の最中でタイマー割り込みが発生し、メインプロセッサ部１０１はブートローダ部４００の処理を強制的に中断させ、セキュアモニタ部２００のモニタハンドラ部２０４に遷移させる（ステップＳ５０１）。モニタハンドラ部２０４はブートローダ部４００のコンテキストを保存する。この処理はＯＳ切替部２０２がノンセキュアＯＳ部５００からセキュアＯＳ部３００に遷移する際に行うコンテキスト保存の処理と同じように行えばよい。そしてメインプロセッサ部１０１の状態をノンセキュアモードからセキュアモードに遷移させ、最後にセキュアＯＳ部３００のタイマー割り込みハンドラ部３９２を実行する。
【０１１６】
タイマー割り込みハンドラ部３９２は、ノンセキュアＯＳ部５００領域の中でブートローダ部４００がノンセキュアＯＳ部５００のイメージの書きこみを完了した部分までのハッシュ値を計算し、その値をハッシュ値格納部３１１に格納する（ステップＳ５０２）。さらに、タイマー割り込みハンドラ部３９２はメモリ設定部３９３を利用してその検証が完了したメモリ領域に対して図１３で示されるセキュア領域Ｂ’１２２ｂ’のポリシーを設定し、ノンセキュアモードからはリードもライトも不可能とする（ステップＳ５０３）。すなわち、検証が完了した領域についてはノンセキュアモードからのリードもライトも禁止するといった設定になる。この時のメインメモリ部１０４の領域設定の様子を図２０に示す。
【０１１７】
図２０に示されるように、検証が完了したメインメモリ部１０４の部分についてはセキュア領域Ｂ’１２２ｂ’に設定されており、まだ検証が完了していないメインメモリ部１０４の部分についてはノンセキュア領域１２１として設定されている。そして、遷移命令呼び出し部３５０は、メインプロセッサ部１０１をセキュアモードからノンセキュアモードに遷移させ（ステップＳ５０４）、コンテキストを復帰させて、タイマー割り込みによって中断させたブートローダ部４００の処理を再開させる。
【０１１８】
ブートローダ部４００がノンセキュアＯＳ部５００のイメージ全体を二次記憶部１０７から読み込むと、ノンセキュアＯＳ部５００用のデータが格納されたノンセキュア領域１２１がすべてセキュア領域Ｂ’１２２ｂ’、すなわちノンセキュアモードからのリードもライトも禁止されるといった状態になる。そしてノンセキュアＯＳ部５００のイメージ全体がノンセキュアＯＳ部５００のデータ用のノンセキュア領域１２１に書きこまれると、ブートローダ部４００はノンセキュアＯＳ部５００が起動する（ステップＳ４０１）。
【０１１９】
この起動はノンセキュアＯＳ部５００用のメモリ領域をリードすることから始まる。すると、ノンセキュアＯＳ部５００用のデータが書きこまれているメモリ領域はセキュア領域Ｂ’１２２ｂ’、すなわち、リード禁止に設定されている。そのため、アドレス空間制御部１０２は読み込みを禁止し、メインプロセッサ部１０１に例外を発生させる。メインプロセッサ部１０１は割り込み設定部２０５の設定に従いモニタハンドラ部２０４に処理を遷移させる。
【０１２０】
モニタハンドラ部２０４はノンセキュアＯＳ部５００のコンテキストを保存する。この処理はＯＳ切替部２０２がノンセキュアＯＳ部５００からセキュアＯＳ部３００に遷移する際に行うコンテキスト保存の処理と同じように行えばよい。そしてモニタハンドラ部２０４はメインプロセッサ部１０１の状態をノンセキュアモードからセキュアモードに遷移させ、最後にセキュアＯＳ部３００のアボートハンドラ部３９０を実行する。
【０１２１】
セキュアＯＳ部３００のアボートハンドラ部３９０は例外が発生する直前の命令をメインメモリ部１０４から読み込む。例外が発生する直前の命令は、ノンセキュアＯＳ部５００用のデータが記憶されたセキュア領域Ｂ’１２２ｂ’を読み込む命令である。すなわち、これからノンセキュアＯＳ部５００を実行しようとしているとセキュアＯＳ部３００は判断し、ハッシュ値検証部３７０を使って、ハッシュ値格納部３１１に格納された値が、期待値格納部３６０に格納された値と一致するか否かをチェックする（ステップＳ１１２、ステップＳ１１３）。
【０１２２】
ハッシュ値と期待値とが一致する場合、以後、ノンセキュアモードでノンセキュアＯＳ部５００用の領域へのリードが発生したとしても以後、例外を発生させないようにアドレス空間制御部１０２を設定する。具体的には、メインプロセッサ部１０１がノンセキュアモードの状態の時、ノンセキュアＯＳ部５００用の領域へのリードは許可・ライトは禁止という設定をメモリ設定部３９３がアドレス空間制御部１０２に施す（ステップＳ５０５）。セキュアＯＳ部３００は遷移命令呼び出し部３５０でＯＳ遷移命令を実行する（ステップＳ１１４）。セキュアモニタ部２００のＯＳ切替部２０２によってＯＳ間遷移がなされると、ブートローダ部４００はメインメモリ部１０４のノンセキュアＯＳ部５００用のデータが記憶されたノンセキュア領域１２１に書かれているノンセキュアＯＳ部５００の実行を開始する。もし期待値と一致しない場合は、エラー処理を行う。
【０１２３】
（変形例７）
図２１は図１７の別例である。図２１に示した構成ではセキュアＯＳ部３００はタイマー割り込みハンドラ部３９２を持たない。図２２に、図２１の構成におけるメインメモリ部１０４の各メモリ領域に対するアクセスの可否のポリシーを示す。なお、このアクセス制御の設定も、セキュアモニタメモリ設定部２０３によって機器起動時の処理の一部としてなされる。メインプロセッサ部１０１がノンセキュアモードにある場合、図１３ではセキュア領域Ｂ’１２２ｂ’はリードアクセスもライトアクセスも許可されていなかった。一方、図２１ではセキュア領域Ｃとしてライトが許可されている点が図１３との違いである。
【０１２４】
図２３に、図２１の構成におけるメインメモリ部１０４の各メモリ領域の構成を示す。なお、このアクセス制御の設定も、セキュアモニタメモリ設定部２０３によって機器起動時の処理の一部としてなされる。変形例６ではノンセキュアＯＳ部５００が書きこまれるノンセキュア領域１２１(ノンセキュアＯＳ用のメモリ領域)に対して、メインプロセッサ部１０１がノンセキュアモードの状態にある場合、ライトアクセスもリードアクセスも許可されていたが、図２３ではセキュア領域Ｃ１２２ｃ、すなわちライトアクセスは許可されるがリードアクセスは禁止されるというように設定されている点が異なる。
【０１２５】
図２４は、情報処理装置１００で、電源投入からノンセキュアＯＳ部５００を起動させるまでの処理を示すフロー図である。図２４に示されるように、ブートローダ部４００によってノンセキュアＯＳ部５００の全体が二次記憶部１０７から読み込まれ、メインメモリ部１０４のノンセキュアＯＳ部５００のセキュア領域Ｃ１２２ｃに書きこまれるまでは図１８のステップＳ１０１〜Ｓ３０２と同様の処理でよい。
【０１２６】
ブートローダ部４００が実行される前の状態ではメインメモリ部１０４のノンセキュアＯＳ部５００のメモリ領域はセキュア領域Ｃ１２２ｃとして設定されており、メインプロセッサ部１０１がノンセキュアモードの状態にある場合、ライトアクセスは許可されるがリードアクセスは禁止された状態となっている。つまり、ノンセキュアモードで動作するブートローダ部４００がノンセキュアＯＳ部５００のノンセキュア領域１２１に二次記憶部１０７から読み込んだノンセキュアＯＳ部５００を書きこんだとしても、アドレス空間制御部１０２はこの書き込みをブロックせず、許可する。またこの書きこみが発生したとしても、セキュアモニタ部２００もセキュアＯＳ部３００も動作しない。さらに、タイマー割り込みがメインプロセッサ部１０１に通知されたとしても、セキュアモニタ部２００もセキュアＯＳ部３００もそのタイマー割り込みをハンドルする訳ではない。
【０１２７】
そしてノンセキュアＯＳ部５００のイメージ全体がノンセキュアＯＳ部５００のセキュア領域Ｃ１２２ｃに書きこまれると、ブートローダ部４００はノンセキュアＯＳ部５００を実行する（ステップＳ４０１）。この実行はノンセキュアＯＳ部５００のセキュア領域Ｃ１２２ｃをリードすることから始まる。すると、ノンセキュアＯＳ部５００が書きこまれている領域は図２２で示されるセキュア領域Ｃ１２２ｃ、すなわち、リード禁止に設定されているため、アドレス空間制御部１０２は読み込みを禁止し、メインプロセッサ部１０１に例外を発生させる。メインプロセッサ部１０１は割り込み設定部２０５の設定に従いモニタハンドラ部２０４に処理を遷移させる。
【０１２８】
モニタハンドラ部２０４はノンセキュアＯＳ部５００のコンテキストを保存する。この処理はＯＳ切替部２０２がノンセキュアＯＳ部５００からセキュアＯＳ部３００に遷移する際に行うコンテキスト保存の処理と同じように行えばよい。そしてメインプロセッサ部１０１の状態をノンセキュアモードからセキュアモードに遷移させ、最後にセキュアＯＳ部３００のアボートハンドラ部３９０を実行する。
【０１２９】
セキュアＯＳ部３００のアボートハンドラ部３９０は例外が発生する直前の命令をメインメモリ部１０４から読み込む。例外が発生する直前の命令は、ノンセキュアＯＳ部５００のセキュア領域Ｃ１２２ｃを読み込む命令である。すなわち、これからノンセキュアＯＳ部５００を実行しようとしているとセキュアＯＳ部３００は判断し、仮想ＴＰＭ部３１０のハッシュ値検証部を使って、ハッシュ値格納部３１１に格納された値が、期待値格納部３６０に格納された値と一致するか否かをチェックする（ステップＳ１１２）。
【０１３０】
もし期待値と一致する場合（ステップＳ１１３：Ｙｅｓ）、以後、ノンセキュアモードでノンセキュアＯＳ部５００用の領域へのリードが発生したとしても以後、例外を発生させないようにアドレス空間制御部１０２を設定する。具体的には、メインプロセッサ部１０１がノンセキュアモードの状態の時、ノンセキュアＯＳ部５００用の領域へのリードは許可・ライトは禁止という設定をメモリ設定部３９３がアドレス空間制御部１０２に施す。そして、セキュアＯＳ部３００は遷移命令呼び出し部３５０でＯＳ遷移命令を実行する（ステップＳ１１４）。セキュアモニタ部２００のＯＳ切替部２０２によってＯＳ間遷移がなされると、ブートローダ部４００はメインメモリ部１０４のノンセキュアＯＳ部５００に書かれているノンセキュアＯＳ部５００の実行を開始する。もし期待値と一致しない場合は（ステップＳ１１３：Ｎｏ）、エラー処理を行う（ステップＳ１１５）。
【０１３１】
このように構成することで、ノンセキュアＯＳ部５００の実行に先立ち、メインメモリ部１０４のノンセキュアＯＳ部５００のセキュア領域Ｃ１２２ｃに、期待するノンセキュアＯＳ部５００が書きこまれているかどうかを検査するという事を実現する。そして、ブートローダ部４００がノンセキュアＯＳ部５００を二次記憶部１０７からメインメモリ部１０４に読み込む処理を行う際、ノンセキュアモードからセキュアモードへの遷移、およびセキュアモードからノンセキュアモードへの遷移を行う必要がないため、機器の起動を高速に行うことができる。また、本実施形態用にブートローダ部４００を修正する必要がなくなるため、機器の実装コストを省略することができる。
【０１３２】
(第２の実施形態)
次に第２の実施形態について説明する。第１の実施形態では、二次記憶部１０７に格納されているノンセキュアＯＳ部５００が改ざんされておらず、期待するイメージであるかどうかを、情報処理装置１００のブート時、すなわちノンセキュアＯＳ部５００の実行時に、あらかじめ計算しておいたハッシュ値と比較することで確認する。そして、一致している場合のみノンセキュアＯＳ部５００の実行を許可する。
【０１３３】
これにより、ノンセキュアＯＳ部５００がブート前に改ざんされる場合は、ブート時にこれを検出する事ができる。しかしながら別の攻撃として、ノンセキュアＯＳ部５００やノンセキュアＯＳ部５００上で動作するアプリケーションに不具合(バグ)が組み込まれており、この不具合を不正に利用して、ノンセキュアＯＳ部５００が動作中に、ノンセキュアＯＳ部５００の領域を改変されてしまう危険性がある。第２の実施形態では、この種の攻撃についても対処するものである。
【０１３４】
第２の実施形態では、メインメモリ部１０４に書きこまれているノンセキュアＯＳ部５００が改ざんされていないかを検査する方法、又は現在メインメモリ部１０４に書きこまれているノンセキュアＯＳ部５００の署名付きハッシュ値を外部から取得できる方法について述べる。これにより、ノンセキュアＯＳ部５００のブート後、ノンセキュアＯＳ部５００の実行中に、不正なプログラムによってメインメモリ部１０４のノンセキュアＯＳ部５００の領域が改変されてしまったとしても、その改変を検出する事ができるようになる。
【０１３５】
なお、第２の実施形態と第１の実施形態は両立が可能である。すなわち、第１の実施形態で述べた方法により、情報処理装置１００のブート時に二次記憶部１０７に格納されているノンセキュアＯＳ部５００が改ざんされておらず、期待するイメージであるかどうかを確認し、かつ情報処理装置が稼働中にはメインメモリ部１０４に書きこまれているノンセキュアＯＳ部５００が改ざんされていないかを検査するといった使い方をすることもできる。
【０１３６】
図２５は、第２の実施形態で説明する情報処理装置１００のメインプロセッサ部１０１で動作するソフトウェアの構成の一例を示している。ハードウェア構成は第１の実施形態と同じ構成でよい。図１２との違いはセキュアＯＳ部３００にタイマー割り込みハンドラ部３９２を備えている点である。
【０１３７】
タイマー割り込みハンドラ部３９２は、所定のタイマーが経過するごとに、ハッシュ値検証部３７０へとハッシュ値検証の依頼を送る。そして、ハッシュ値検証部３７０は、依頼を受けるごとに、メインメモリ部１０４のノンセキュアＯＳ部５００用のメモリ領域に書かれているノンセキュアＯＳ部５００のイメージを読み込み、そのハッシュ値を定期的に計算し、期待値と一致しているかどうか確認する。
【０１３８】
図２６−２は、情報処理装置１００で、タイマー割り込みが発生した時の処理を示すシーケンス図である。なお、機器起動時の処理の一部として、セキュアモニタ部２００の割り込み設定部２０５はタイマー割り込みが発生した場合、モニタハンドラ部２０４に処理を遷移させるように設定しておく。
【０１３９】
処理は、情報処理装置１００の実行中にタイマー割り込みが発生し、検出された際に開始される（ステップＳ６０１）。メインプロセッサ部１０１はノンセキュアＯＳ部５００の処理を強制的に中断させ、セキュアモニタ部２００のモニタハンドラ部２０４に遷移させる。まず、モニタハンドラ部２０４はタイマー割り込みがノンセキュアＯＳ部５００実行中に発生したのか、又はセキュアＯＳ部３００実行中に発生したのかを判定する（ステップＳ６０２）。メインプロセッサ部１０１は割り込みが発生して処理をセキュアモニタ部２００のモニタハンドラ部２０４に遷移させたとしても、モードは変更しないため、割り込み発生前のモードを調べるには、現在のメインプロセッサ部１０１の状態を調べれば分かる。
【０１４０】
ノンセキュアＯＳ部５００のイメージを検証するには、メインメモリ部１０４からノンセキュアＯＳ部５００を読み込み、ハッシュ値を計算する必要がある。ノンセキュアＯＳ部５００のサイズは大きいため、読み込みとハッシュ値の計算は時間がかかる。従って、タイマー割り込みが発生してから次のタイマー割り込みが発生するまでの短い時間でノンセキュアＯＳ部５００全体をメインメモリ部１０４から読み込んでハッシュ値を計算できない場合がある。もしハッシュ値を計算する処理を継続してしまうと、その間はノンセキュアＯＳ部５００の処理を実行する事ができず、ノンセキュアＯＳ部５００が停止した状態になる。これはノンセキュアＯＳ部５００でタッチパネルなどのユーザインターフェースを提供している場合には応答時間が遅くなったり、ネットワーク通信を行っている場合にはタイムアウトしてしまったりする可能性があるため、長時間ノンセキュアＯＳ部５００の処理を中断させておくことは好ましくない。
【０１４１】
そのため、セキュアＯＳ部３００実行中にタイマー割り込みが発生した場合（ステップＳ６０２：Ｎｏ）、セキュアＯＳ部３００の実行可能期限が切れたと判断してノンセキュアＯＳ部５００に処理を遷移させる（ステップＳ６１１）。この処理はＯＳ切替部２０２がセキュアＯＳ部３００からノンセキュアＯＳ部５００に遷移する際に行うコンテキスト保存の処理と同じように行えばよい。一方、ノンセキュアＯＳ部５００実行中にタイマー割り込みが発生した場合（ステップＳ６０２：Ｙｅｓ）、セキュアＯＳ部３００によるノンセキュアＯＳ部５００の検査のタイミングが来たと判断して、セキュア状態に遷移させ、以降の処理を行う（ステップＳ６１３）。
【０１４２】
なお、タイマー割り込みの発生の間隔が短い場合、タイマー割り込みが発生するたびにこの判断処理を行う必要はない。図２６−１にその場合の処理を示すシーケンス図を示す。タイマー割り込みの時間間隔が短いと、セキュア状態にいる時にはすぐにノンセキュア状態に遷移してしまうため、セキュアＯＳ部３００の処理を行う時間が短くなり、セキュアＯＳ部３００がノンセキュアＯＳ部５００のイメージ検証を実行する頻度が少なくなってしまう。そこで、たとえばタイマー割り込みがＮ回してそのうち１回この判断処理を行うようにしてもよい。つまり、セキュア状態にいる間、タイマー割り込みがＮ回発生したとして、そのうち１回だけノンセキュア状態に遷移するようにしてもよい（ステップＳ６０３：Ｙｅｓ）。このようにＮ回目が来たのかどうか、すなわちセキュア状態の実行可能時間がタイムアウトしたかどうかを判断するようにしてもよい。
【０１４３】
もし、ノンセキュアＯＳ部５００実行中にタイマー割り込みが発生した場合（ステップＳ６０２：Ｙｅｓ）、ＯＳ間遷移命令が実行され、ノンセキュアＯＳ部５００のコンテキストが保存される（ステップＳ６１３）。この処理はＯＳ切替部２０２がノンセキュアＯＳ部５００からセキュアＯＳ部３００に遷移する際に行うコンテキスト保存の処理と同じように行えばよい。そしてメインプロセッサ部１０１の状態をノンセキュアモードからセキュアモードに遷移させ、最後にセキュアＯＳ部３００のタイマー割り込みハンドラ部３９２を実行する。
【０１４４】
タイマー割り込みハンドラ部３９２は、メインメモリ部１０４に書かれているノンセキュアＯＳ部５００のメモリ領域からＯＳデータをリードする（ステップＳ６０４）。次いで、タイマー割り込みハンドラ部３９２は、ハッシュ計算部３２０を通じてリードしたメモリ領域のデータのハッシュ値を計算し（ステップＳ６０５）、仮想ＴＰＭ部３１０のハッシュ値格納部３１１に格納する（ステップＳ６０６）。
【０１４５】
上述のように、ノンセキュアＯＳ部５００のイメージサイズは大きいため、１回のメモリ読み込みではイメージ全体を読み込めず、メインメモリ部１０４のメモリ領域から順次読み込んでハッシュ値を計算する必要がある。そこで、全てのメインメモリ部１０４のメモリ領域の最後までリードが完了したか否かが判定される（ステップＳ６０７）。全てのリードが完了していない場合（ステップＳ６０７：Ｎｏ）、ステップＳ６０４からの処理が繰り返される。全てのリードが完了した場合（ステップＳ６０７：Ｙｅｓ）、ハッシュ値検証部３７０は、ノンセキュアＯＳ部５００のイメージと、期待値格納部３６０に記憶された正規のノンセキュアＯＳ部５００のイメージとが同一であるか比較する（ステップ６０８）。期待値と一致する場合（ステップＳ６０９：Ｙｅｓ）、すなわち改ざんが起こっていない場合、期待値格納部３６０に格納してある値と、セキュアＯＳ部３００が計算する値は一致させなければいけない。値を一致させるには、期待値格納部３６０に格納してある値を計算する時に逐次的に読み込んだデータサイズと、セキュアＯＳ部３００のハッシュ計算部２００で計算する時に使う逐次的に読み込んだデータのデータサイズを同じにする必要がある。このデータサイズはあらかじめ所定のサイズに決めておく。
【０１４６】
なお、セキュアＯＳ部３００がノンセキュアＯＳ部５００のハッシュ値を計算中にタイマー割り込みが発生し、ノンセキュアＯＳ部５００に処理が遷移した場合には、中間値が仮想ＴＰＭ部３１０のハッシュ値格納部３１１に格納されている事になる。そしてノンセキュアＯＳ部５００実行中にタイマー割り込みによって再びセキュアＯＳ部３００のタイマー割り込みハンドラ部３９２に処理が戻ってきた時には、この中間値を計算した時点から処理が再開される。
【０１４７】
ノンセキュアＯＳ部５００のハッシュ値を最後まで計算したならば、期待値格納部３６０に格納されている値と、ハッシュ値格納部３１１に格納されている値を比較する。一致している場合には、ノンセキュアＯＳ部５００が改ざんされていない事を示すため、正常な状態であると判断してＯＳ間遷移命令を実行し（ステップＳ６１１）、ノンセキュアＯＳ部５００の処理を継続する（ステップＳ６１２）。値が一致していない場合にはエラー処理を行う（ステップＳ６１０）。
【０１４８】
エラー処理としては、システムを停止させる方法、情報処理装置に接続されているモニター(不図示)に検証処理が失敗したことを伝えるメッセージを表示させる方法、成功した時と同様に遷移命令呼び出し部３５０でＯＳ遷移命令を実行し、ノンセキュアＯＳ部５００を実行させる方法がある。
【０１４９】
なお、仮にノンセキュアＯＳ部５００の検証処理が失敗したとしても、その失敗したという情報をノンセキュアＯＳ部５００等が知り得るのであれば、ノンセキュアＯＳ部５００のブート処理を継続する事が有用な場合もある。このため、仮想ＴＰＭ部３１０のハッシュ値格納部３１１に格納されている値に対して、秘密鍵格納部３１３に格納されている値を秘密鍵として、署名計算部３１２によって署名を行い、その値をノンセキュアＯＳ部５００に渡す処理を行ってもよい。もちろん、検証処理が成功した場合でも、署名付きハッシュ値をノンセキュアＯＳ部５００に渡してもよい。
【０１５０】
（第３の実施形態)
第３の実施形態は、保護対象のアプリケーションをノンセキュアＯＳ部５００上で実行させることで、アプリケーションの処理を不正な改変から保護したり、アプリケーションが生成したデータをそのアプリケーションからしかアクセスできないようにしたりが可能なデータ保護の仕組みを提供するものである。たとえば、セキュアＯＳ部上で動作するアプリケーションがデータを生成し、そのデータを同じアプリケーションが再利用する場合には、仮にノンセキュア部、あるいは二次記憶装置に一旦出力したとしても、生成した値と、再利用する際の値が同一であり、改変を防止する手段を提供する事が望ましい。また、ユースケースによってはデータを生成した情報処理装置でしか再利用できないといった制約や、データを生成したアプリケーションしか再利用できないといった制約が必要な場合もある。第３の実施形態では、これらの課題を解決するものである。
【０１５１】
図２７は、第３の実施形態で説明する情報処理装置１００のメインプロセッサ部１０１で動作するソフトウェアの構成の一例を示している。ハードウェア構成は第１の実施形態と同じ構成でよい。すなわち、ソフトウェアはセキュアモニタ部２００、セキュアＯＳ部３００、ノンセキュアＯＳ部５００を含んでいる。
【０１５２】
セキュアモニタ部２００はセキュアＯＳ部３００とノンセキュアＯＳ部５００を切り替える処理を行う。セキュアモニタ部２００はまた起動時にセキュアＯＳ部３００をロードして実行する処理も行う。
【０１５３】
セキュアＯＳ部３００は、第１の実施形態と比較して、あらたに実行モジュールロード部３９４、モジュール署名生成部３９５、アプリ実行部３９６、命令セレクタ部３９７、及びパラメタロード部３９８を備えている。命令セレクタ部３９７は、ノンセキュアＯＳ部５００からセキュアＯＳ部３００に処理が遷移した際、次にセキュアＯＳ部３００内のどの処理を実行するか選択する。選択の方法については後述する。
【０１５４】
実行モジュールロード部３９４は、セキュアＯＳ部３００上で動作させるアプリケーション（以後、実行モジュールと呼ぶ）をセキュアＯＳ部３００のメモリ領域にロードする処理を行う。パラメタロード部３９８は、セキュアＯＳ部３００上で動作させるアプリケーションに必要なパラメタをセキュアＯＳ部３００のメモリ領域にロードする処理を行う。アプリ実行部３９６は、セキュアＯＳ部３００のメモリ領域にロードしたアプリケーションを実行する。ハッシュ計算部３２０はセキュアＯＳ部３００のメモリ領域にロードしたアプリケーションに対するハッシュ値を計算する。モジュール署名生成部３９５は、ハッシュ計算部３２０が生成したハッシュ値に対して、仮想ＴＰＭ部３１０に記憶された秘密鍵を使って署名を生成する。メモリライト部３４０はデータをメインメモリ部１０４にストア(ライト)する。このストアの処理はアドレス空間制御部１０２を介して行われる。仮想ＴＰＭ部３１０、遷移命令呼び出し部３５０は、第１の実施形態と同様の構成でよい。ここで、パラメタとは実行モジュールが実行に必要なデータの事を指す。たとえば、実行モジュールが公開鍵暗号を使った暗号処理だった場合、暗号対象の平文データや公開鍵暗号処理の暗号計算に必要なパラメタのことを指す。また、実行モジュールが共通鍵暗号を使った復号処理だった場合、復号対象の暗号化されたデータの事を指す。なお、実行モジュールが実行時にパラメタを必要としない場合は、パラメタロード部３９８は必須ではない。
【０１５５】
ノンセキュアＯＳ部５００は、パラメタ取得部５０６、実行モジュール取得部５０７、共有領域ライト部５０８、共有領域リード部５０９、検証処理部５１０、検証鍵管理部５１１、遷移命令呼び出し部５１２を備えている。遷移命令呼び出し部５１２は、第１の実施形態と同様の構成でよい。また、実行モジュールが実行時にパラメタを必要としない場合は、パラメタ取得部５０６は必須ではない。さらに、実行モジュールが実行後に共有領域１２３に対して何も出力を行わないのであれば、共有領域リード部５０９は必須ではない。
【０１５６】
実行モジュール取得部５０７は、セキュアＯＳ部３００で実行する実行モジュールを二次記憶部１０７やネットワークで接続された装置等から取得する処理を行う。パラメタ取得部５０６は、セキュアＯＳ部３００で実行する実行モジュールに必要なパラメタを二次記憶部１０７やネットワークで接続された装置等から取得する処理を行う。共有領域ライト部５０８は、セキュアＯＳ部３００で実行する実行モジュールやパラメタをメインメモリ部１０４にストア(ライト)する。このストアの処理はアドレス空間制御部１０２を介して行われる。
【０１５７】
共有領域リード部５０９は、セキュアＯＳ部３００で生成されたセキュアＯＳ部３００で実行する実行モジュールの署名付きハッシュ値や、セキュアＯＳ部３００上で実行されるアプリケーションが生成した実行モジュールの処理結果をメインメモリ部１０４からリード(ロード)する。このリードの処理はアドレス空間制御部１０２を介して行われる。
【０１５８】
検証処理部５１０は、セキュアＯＳ部３００で生成された、セキュアＯＳ部３００で実行される実行モジュールの署名の正当性を公開鍵を用いて検証する。検証鍵管理部５１１は、検証処理部５１０で使う公開鍵を蓄積し、管理する。図２８は、第３の実施形態におけるメインメモリ部１０４のメモリマップであり、セキュア領域Ａ１２２ａに実行モジュールと、実行モジュール用データが記憶されている点が第１の実施形態の図９とは異なる。すなわち、実行モジュールは、セキュアモードでなければ、ライトもリードも不可能となっている。
【０１５９】
図２９は、情報処理装置１００で、ノンセキュアＯＳ部５００にて実行モジュールを実行する際の処理を示すフロー図である。まず、ノンセキュアＯＳ部５００、またはノンセキュアＯＳ部５００上で実行されるアプリケーションは、実行モジュール取得部５０７を通じてセキュアＯＳ部３００で実行する実行モジュールを取得し、共有領域ライト部５０８でメインメモリ部１０４の共有領域１２３に書きこむ（ステップＳ７０１）。さらに、ノンセキュアＯＳ部５００、またはノンセキュアＯＳ部５００上で実行されるアプリケーションは、セキュアＯＳ部３００で実行する実行モジュールに必要なパラメタも共有領域１２３に書きこむ（ステップＳ７０２）。アドレス空間制御部１０２によって共有領域１２３はノンセキュアモードからでも読み書きが可能な設定になっているため（図４参照）、これらの書きこみは成功する。
【０１６０】
そして、遷移命令呼び出し部４０４は、ＯＳ間遷移を行うよう、メインプロセッサ部１０１に指示する（ステップＳ７０３）。このとき、遷移命令呼び出し部４０４は、実行モジュール及びパラメタのロード命令であることをセキュアＯＳ部３００に通知する。このロード命令であることを通知する方法として、共有領域１２３に命令種別を書きこむようにすればよい。
【０１６１】
メインプロセッサ部１０１は、セキュアモニタ部２００のＯＳ切替部２０２を呼び出す。ＯＳ切替部２０２では、ノンセキュアＯＳ部５００のコンテキストの退避、及びセキュアＯＳ部３００のコンテキストの復帰処理とモードの切り替え処理を行う。そして、命令セレクタ部３９７を呼び出す。
【０１６２】
命令セレクタ部３９７では、今回の遷移後に実行する命令が実行モジュール及びパラメタのロード命令であること識別し、実行モジュールロード部３９４とパラメタロード部３９８をそれぞれ呼び出す。この命令種別の識別方法として、共有領域１２３に書きこまれている命令種別を読み出すようにすればよい。
【０１６３】
次いで、パラメタロード部３９８は、共有領域１２３に書きこまれている実行モジュールのパラメタをパラメタの領域であるセキュア領域Ａ１２２ａにコピーして書き込む。また、実行モジュールロード部３９４は、共有領域１２３に書きこまれている実行モジュールのイメージを実行モジュールの領域であるセキュア領域Ａ１２２ａにコピーして書き込む（ステップＳ７０５）。この時、パラメタロード部３９８も実行モジュールロード部３９４も、セキュアモードで動作しているが、実行モジュール、及びパラメタの領域であるセキュア領域Ａ１２２ａはセキュアモードから書きこみが可能な設定になっているため（図１３参照）、これらの書きこみは成功する。そして、実行モジュールロード部３９４は、ハッシュ計算部３２０を呼び出す。
【０１６４】
ハッシュ計算部３２０はセキュア領域Ａ１２２ａにコピーされた実行モジュールのハッシュ値を計算し、仮想ＴＰＭ部３１０に送信する。仮想ＴＰＭ部３１０は、受信したハッシュ値をハッシュ値格納部３１１に格納する（ステップＳ７０６）。そして、セキュアＯＳ部３００は遷移命令呼び出し部３５０でＯＳ遷移命令を実行する（ステップＳ７０７）。セキュアモニタ部２００のＯＳ切替部２０２はセキュアＯＳ部３００のコンテキストの退避、及びノンセキュアＯＳ部５００のコンテキストの復帰処理とモードの切り替え処理を行い、ノンセキュアＯＳ部５００がＯＳ間遷移で中断した処理を再開させる。
【０１６５】
ノンセキュアＯＳ部５００、又はノンセキュアＯＳ部５００上で実行されるアプリケーションは、次にアプリ実行を命令する指示をメインメモリ部１０４の共有領域１２３に書きこむ（ステップＳ７０８）。そして、再び遷移命令呼び出し部４０４は、ＯＳ間遷移を実行する（ステップＳ７０９）。
【０１６６】
セキュアＯＳ部３００の命令セレクタ部３９７では、共有領域１２３に書きこまれた命令種別から今回の遷移後に実行する命令が実行モジュールの実行であること識別し、アプリ実行部３９６を呼び出す。アプリ実行部３９６は、メインメモリ部１０４の実行モジュールの領域であるセキュア領域Ａ１２２ａに書かれているコードを実行する（ステップＳ７１０）。実行モジュールは必要に応じてセキュア領域Ａ１２２ａにコピーされたパラメタを使い、処理を実行する。
【０１６７】
実行が終了すると、セキュアＯＳ部３００は遷移命令呼び出し部３５０でＯＳ遷移命令を実行し、ノンセキュアＯＳ部５００の処理を再開させる（ステップＳ７１１）。
【０１６８】
この際、実行モジュールは処理の結果を共有領域１２３に書き出してもよい。たとえば、実行モジュールが公開鍵アルゴリズムによって公開鍵と秘密鍵を生成する処理を行うコードだった場合、公開鍵がノンセキュアＯＳ部５００から利用できるように、生成した公開鍵をメインメモリ部１０４の共有領域１２３に書き出す処理を行ってもよい。なお、これまで実行モジュールのロード命令と実行モジュールの実行命令は別々の命令とし、命令セレクタ部がどちらの命令であるかを識別する方法について説明してきた。すなわち、ロード命令と実行命令でそれぞれセキュアモードへの遷移処理を行っていたが、これを実行モジュールのロード処理と実行処理を１回の遷移処理で行うようにしてもよい。その場合、ステップＳ７０６の後にノンセキュア状態に遷移することなくステップＳ７１０が実行されることになる。
【０１６９】
また、ノンセキュアＯＳ部５００は、必要に応じて、セキュアＯＳ部３００で実行した実行モジュールが意図したものであるかどうか検証する処理を行ってもよい。これは、まず、あらかじめ仮想ＴＰＭ部３１０の秘密鍵格納部３１３に格納されている秘密鍵に対応した公開鍵をノンセキュアＯＳ部５００が有している事を前提とする。これは、仮想ＴＰＭ部３１０に対して公開鍵を取得するインターフェースを用意しておき、セキュアＯＳ部３００が公開鍵を共有領域１２３に書き出す処理を行うなどの方法をとればよい。
【０１７０】
次に、ノンセキュアＯＳ部５００は、命令種別として検証処理を行う事を示す値を共有領域１２３に書きこみ、再び遷移命令呼び出し部４０４を使って、ＯＳ間遷移をさせる（ステップＳ７１３）。
【０１７１】
セキュアＯＳ部３００の命令セレクタ部３９７は、共有領域１２３の命令種別を読み込み、今回の遷移後に実行する命令が実行モジュールの検証であること識別し、モジュール署名生成部３９５を呼び出す。モジュール署名生成部３９５は、仮想ＴＰＭ部３１０のハッシュ値格納部３１１に格納されている値を取得する。この値はステップＳ７０６で計算した実行モジュールのハッシュ値である。そして、モジュール署名生成部３９５は取得した値に対して、秘密鍵格納部３１３に格納されている秘密鍵を使い、署名計算部３１２で署名を施す処理を依頼する。そしてモジュール署名生成部３９５は実行モジュールのハッシュ値に対する署名を生成して、署名付きハッシュ値を取得する（ステップＳ７１４）。
【０１７２】
なお、セキュアＯＳ部３００は、実行モジュールを複数ロードできるようになっていてもよい。この場合、実行モジュールを一意に識別する番号を付け、実行モジュールごとにハッシュ値格納部３１１にハッシュ値を格納する。そしてその署名を要求する際、一意に識別する番号から、どの実行モジュールに対するハッシュ値を要求しているかを調べ、そのハッシュ値に対する署名付きハッシュ値を要求するように仮想ＴＰＭ部３１０に指示するようにすればよい。
【０１７３】
仮想ＴＰＭ部３１０から署名付きハッシュ値、すなわち実行モジュールの署名付きハッシュ値を受信すると、セキュアＯＳ部３００はその値を共有領域１２３に書き出し（ステップＳ７１５）、遷移命令呼び出し部３５０でＯＳ遷移命令を実行し、ノンセキュアＯＳ部５００の処理を再開させる（ステップＳ７１６）。
【０１７４】
その後、ノンセキュアＯＳ部５００は、署名付きハッシュ値を共有領域１２３からリードし（ステップＳ７１７）、あらかじめ有している公開鍵を使ってハッシュ値の署名を検証する（ステップＳ７１８）。このようにして、ノンセキュアＯＳ部５００からセキュアＯＳ部３００で実行した実行モジュールの正当性を確認する事ができる。もちろん、この署名検証は必ずしもノンセキュアＯＳ部５００で行う必要はなく、あらかじめ公開鍵を検証者に渡して置き、検証要求に基づいて署名付きハッシュ値をネットワークで他機器に送信し、ネットワークで接続された機器が署名を検証するようにしてもよい。このようにすれば、情報処理装置１００で実行された実行モジュールが正しいかどうかを遠隔地から検証する事が可能となる。
【０１７５】
（変形例８）
なお、ハッシュ値格納部３１１は複数のハッシュ値を格納する事ができるが、この実行モジュールのハッシュ値は、まだ何の値も格納していない領域に格納してもよいし、セキュアＯＳ部３００のハッシュ値が格納されている領域に格納してもよい。この時の構成を図３０に示す。図３０ではセキュアモニタ部２００にモニタハッシュ計算部２０６を備えている点が図２７と異なる。
【０１７６】
モニタハッシュ計算部２０６は、セキュアＯＳ部３００の実行に先立ち、メインメモリ部１０４に書きこまれたセキュアＯＳ部３００の領域であるセキュア領域１２２に対するハッシュ値を計算しておく。そして、セキュアＯＳ部３００の仮想ＴＰＭ部３１０のハッシュ値格納部３１１の一つにその値を格納する。
【０１７７】
なお、セキュアＯＳ部３００を実行する前はハッシュ値格納部３１１も動作していない。このため、セキュアＯＳ部３００のハッシュ値の計算は実行前に行っておき、セキュアＯＳ部３００実行後に、セキュアＯＳ部３００のハッシュ計算部３２０にその値を格納するように依頼してもよい。
【０１７８】
たとえば、セキュアＯＳ部３００のハッシュ値をＸとすると、セキュアＯＳ部３００のハッシュ値をハッシュ値格納部３１１に入れると、ハッシュ値格納部３１１の値は以下のようになる。
【０１７９】
ハッシュ値格納部３１１の値＝ｆ（Ｘ  ｜｜  ０）
【０１８０】
この状態で、図２９の処理に従って、セキュアＯＳ部３００が実行モジュールのハッシュ値をハッシュ値格納部３１１に格納すると、ハッシュ値格納部３１１の値は以下のようになる。
【０１８１】
ハッシュ値格納部３１１の値=ｆ（実行モジュールのハッシュ値｜｜ハッシュ値格納部３１１の値)
【０１８２】
この値に対し、秘密鍵格納部３１３に格納されている秘密鍵を使い、署名計算部３１２で署名を施す処理を行って、検証者に渡す。すると、もし、ハッシュ値の値が一致しない場合、実行モジュールが不正に改変されているか、検証者が期待するセキュアＯＳ部３００ではないプラットホーム上で実行モジュールが実行されたか、又はその両方の場合であるため、検証者は、実行モジュールが期待するセキュアＯＳ部３００上で実行されたことを確認する事ができる。
【０１８３】
（変形例９）
図３１は、図２９の別例である。図２９では、実行モジュールをロードする命令、実行する命令、検証する命令をそれぞれ分けて、その都度、ＯＳ間遷移を実行していた。図３１に示す例では、これらを１回のＯＳ間遷移で済ませてしまう例である。
【０１８４】
ステップＳ８０１〜ステップＳ８０７までの処理は図２９のステップＳ７０１〜ステップＳ７０７までの処理と同様である。次に、セキュアＯＳ部３００はＯＳ間遷移を行うのではなく、アプリを実行する（ステップＳ８０８）。アプリは必要に応じて処理結果を共有領域１２３に書き出す。
【０１８５】
さらに、アプリの実行が終了すると、セキュアＯＳ部３００は、仮想ＴＰＭ部３１０から実行モジュールに対する署名付きハッシュ値を取得し（ステップＳ８０９）、その値を共有領域１２３に書き出す（ステップＳ８１０）。そしてセキュアＯＳ部３００は、ＯＳ間遷移を実行する（ステップＳ８１１）。
【０１８６】
その後、ノンセキュアＯＳ部５００は、署名付きハッシュ値を共有領域１２３からリードし（ステップＳ８１２）、あらかじめ有している公開鍵を使ってハッシュ値の署名を検証する（ステップＳ８１３）。このようにして、ＯＳ間遷移を１回で済ませることができるため、実行モジュールの実行とノンセキュアＯＳ部５００からセキュアＯＳ部３００で実行した実行モジュールの正当性を確認する処理を高速に行う事ができる。
【０１８７】
（変形例１０）
図３２は、図２７の別例である。図２７の構成に加え、情報処理装置１００は、仮想ＴＰＭ部３１０がデータ暗号化部３１４、及びデータ復号化部３１５を備えている点と、セキュアＯＳ部３００がメモリリード部３３０を備えている。
【０１８８】
なお、秘密鍵格納部３１３は公開鍵暗号の秘密鍵に加えて、共通鍵暗号の共通鍵を備えているものとする。共通鍵としては、秘密鍵を暗号化するための第１共通鍵、及び実行モジュールが生成するデータを暗号化する際に用いる第２共通鍵との少なくとも一方を含んでいる。なお、第１共通鍵、及び第２共通鍵はともに共通のものであってもよい。データ暗号化部３１４はアプリ実行部３９６の要求に基づいて、データを仮想ＴＰＭ部３１０内の秘密鍵格納部３１３の共通鍵で暗号化する処理を行う。また、データ暗号化部３１４は、秘密鍵を共通鍵で暗号化する処理も行う。データ復号化部３１５はアプリ実行部３９６の要求に基づいて、暗号化してあるデータを仮想ＴＰＭ部３１０内の秘密鍵格納部３１３の共通鍵で復号する処理を行う。
【０１８９】
なお、データを暗号化する際、その引数としてハッシュ値格納部３１１の値を含めた以下の式で計算する。
【０１９０】
暗号化データ＝ｇ（仮想ＴＰＭ部３１０の共通鍵,データｘｏｒハッシュ値格納部３１１の値）
【０１９１】
ここで、ｇはＡＥＳやＤＥＳなどの共通鍵暗号の暗号処理を示す。ｇ（ｋｅｙ，ｄａｔａ）は、ｋｅｙを鍵として、ＡＥＳにてｄａｔａを暗号化する関数である。さらにデータの暗号化にハッシュ値格納部３１１の値が関与する。メモリリード部３３０は、共有領域１２３から暗号化データを取得する処理を行う。
【０１９２】
図３３は、図３２のセキュアＯＳ部３００で実行させる実行モジュール６００のソフトウェア構成の一例を示すブロック図である。実行モジュール６００はデータ生成部６０１、データ暗号化依頼部６０２、データ送信依頼部６０３、データ受信依頼部６０４、データ復号化依頼部６０５、及び第２データ処理部６０６を備えている。
【０１９３】
データ生成部６０１は、データを生成する処理を行う。たとえば、データとして公開鍵アルゴリズムを使った公開鍵ペアの生成処理などである。データ送信依頼部６０３は、セキュアＯＳ部３００のメモリライト部３４０に対して、実行モジュールのデータを共有領域１２３に書き出す事を依頼する処理を行う。データ暗号化依頼部６０２は、仮想ＴＰＭ部３１０に対してデータを入力し、仮想ＴＰＭ部３１０の秘密鍵格納部３１３に格納されている共通鍵を使って暗号化する事を依頼する処理を行う。データ受信依頼部６０４は、セキュアＯＳ部３００のメモリリード部３３０に対して、データを共有領域１２３から読み出す事を依頼する処理を行う。
【０１９４】
データ復号化依頼部６０５は、データ受信依頼部６０４で受信したデータを仮想ＴＰＭ部３１０に対して入力し、仮想ＴＰＭ部３１０の秘密鍵格納部３１３に格納されている共通鍵を使って復号化する事を依頼する処理を行う。第２データ処理部６０６は、データ受信依頼部で受信したデータを仮想ＴＰＭ部３１０に対して入力し、仮想ＴＰＭ部３１０の秘密鍵格納部３１３に格納されている秘密鍵を使って署名値を計算する事を依頼する処理を行う。
【０１９５】
図３４は、図３２の情報処理装置で図３３の実行モジュールを実行する際の処理を示すフロー図である。処理の開始前には図２９、又は図３１の処理に従って実行モジュール６００がメインメモリ部１０４の実行モジュールの領域であるセキュア領域Ａ１２２ａに書きこまれており、実行モジュールロード部３９４によって仮想ＴＰＭ部３１０のハッシュ値格納部３１１に実行モジュール６００のハッシュ値が格納されているものとする。
【０１９６】
図３４に示されるように、処理は、秘密鍵生成フェーズと署名計算フェーズとに区分される。ノンセキュアＯＳ部５００及び、セキュアＯＳ部３００上で実行される実行モジュール６００以外の実行モジュールから実行モジュール６００がデータ生成部６０１で生成した秘密鍵の値を読み取られないようにすることがこの実施形態の特徴である。
【０１９７】
まず秘密鍵生成フェーズについて述べる。図３４に示されるように、ノンセキュアＯＳ部５００、又はノンセキュアＯＳ部５００上で実行されるアプリケーション(以下、ノンセキュアアプリケーションとする)は、実行モジュール６００に対して公開鍵ペアを生成するよう指示する命令種別を共有領域１２３に書き込む（ステップＳ９０１）。そして、ノンセキュアＯＳ部５００は、ＯＳ間遷移を実行する（ステップＳ９０２）。
【０１９８】
セキュアＯＳ部３００の命令セレクタ部３９７では、今回の遷移後に実行する命令が実行モジュールの実行であること識別し、アプリ実行部３９６を呼び出す。実行モジュール６００は共有領域１２３に書きこまれている命令種別から公開鍵ペア生成の命令であることを識別し、所定の公開鍵アルゴリズムによって秘密鍵と公開鍵を生成する（ステップＳ９０３）。この公開鍵アルゴリズムはたとえばＲＳＡや楕円曲線暗号などのよく知られたものを利用すればよい。なお、共通鍵ペアを生成するに至る中間値を一次的にメインメモリ部１０４に格納する際には実行モジュール用データ用のセキュア領域Ａ１２２ａを利用する。この領域はセキュア領域Ａ１２２ａとして指定しているため、ノンセキュアＯＳ部５００やノンセキュアアプリケーションがアクセスすることはできない。
【０１９９】
そして、実行モジュール６００は、データ暗号化依頼部６０２を使ってセキュアＯＳ部３００に対してデータ生成部６０１で生成した秘密鍵を暗号化するよう依頼する（ステップＳ９０４）。セキュアＯＳ部３００のアプリ実行部３９６は仮想ＴＰＭ部３１０のデータ暗号化部３１４を呼び出し、平文の秘密鍵を入力として与える。データ暗号化部３１４は、以下の式に従って秘密鍵を暗号化する。
【０２００】
暗号化秘密鍵＝ｇ（仮想ＴＰＭ部３１０の共通鍵，秘密鍵ｘｏｒハッシュ値格納部３１１の値）
【０２０１】
なお、ここではハッシュ値格納部３１１の値に実行モジュール６００の値のみ入力させた状態、すなわちｆ(実行モジュール６００のハッシュ値｜｜０)の値が格納されている事を想定している。しかしながら、ハッシュ値格納部３１１にはセキュアＯＳ部３００のハッシュ値を格納した後に実行モジュール６００のハッシュ値が格納されていてもよい。その場合はハッシュ値格納部３１１の値は以下のような計算を行った結果となる。
【０２０２】
ハッシュ値格納部３１１の値＝ｆ（実行モジュール６００のハッシュ値｜｜ｆ（セキュアＯＳ部３００のハッシュ値｜｜０））
【０２０３】
そして、データ暗号化部３１４は、暗号化秘密鍵と公開鍵を共有領域１２３に書き出し（ステップＳ９０５）、ＯＳ間遷移を実行する（ステップＳ９０６）。ノンセキュアＯＳ部５００またはノンセキュアアプリケーションは、共有領域１２３から暗号化秘密鍵と公開鍵を読み込み（ステップＳ９０７）、それぞれファイルとして二次記憶部１０７に書き出す（ステップＳ９０８）。このようにして、実行モジュール６００のハッシュ値にバインドして秘密鍵を暗号化する。
【０２０４】
次に、署名計算フェーズについて説明する。まず、ノンセキュアＯＳ部５００またはノンセキュアアプリケーションが二次記憶部１０７から暗号化秘密鍵を読み込み（ステップＳ９０９）、共有領域１２３に書き出す。そして、ノンセキュアＯＳ部５００は、命令種別として実行モジュール６００を実行し、さらに実行モジュール６００は署名を施すよう指示する値と、署名対象のデータを共有領域１２３に書き込み（ステップＳ９１０）、ＯＳ間遷移を実行する（ステップＳ９１１）。
【０２０５】
セキュアＯＳ部３００の命令セレクタ部３９７は、共有領域１２３に書きこまれている命令種別を読み出し、今回の遷移後に実行する命令が実行モジュールの実行であることを識別し、アプリ実行部３９６を呼び出す。実行モジュール６００は共有領域１２３に書きこまれている命令種別を読み出し、その値から署名生成の命令であることを識別し、さらに暗号化秘密鍵、署名対象のデータを共有領域１２３から読み込む（ステップＳ９１２）。
【０２０６】
そして、実行モジュール６００は、データ復号化依頼部６０５を使ってセキュアＯＳ部３００に対して秘密鍵を復号化するよう依頼する（ステップＳ９１３）。セキュアＯＳ部３００のアプリ実行部３９６は仮想ＴＰＭ部３１０のデータ復号化部３１５を呼び出し、暗号化された秘密鍵を入力として与える。データ復号化部３１５は、以下の式に従って秘密鍵を復号化する。
【０２０７】
平文秘密鍵＝ｇ'（仮想ＴＰＭ部３１０の共通鍵，平文秘密鍵ｘｏｒハッシュ値格納部３１１の値)
ここで、ｇ'は共通鍵暗号の暗号処理に対応する復号処理を示す。ｇ'（ｋｅｙ，ｄａｔａ）は、ｋｅｙを鍵として、たとえばＡＥＳにてｄａｔａを復号化する関数である。
【０２０８】
次いで、署名計算部３１２は、出力として取得した平文秘密鍵を使って所定の署名アルゴリズムによって署名対象のデータに対して署名値を計算し、対象のデータに署名を施す（ステップＳ９１４）。そして、署名計算部３１２は、署名値を共有領域１２３に書き出し（ステップＳ９１５）、セキュアＯＳ部３００は、ＯＳ間遷移を実行する（ステップＳ９１６）。
【０２０９】
ノンセキュアＯＳ部５００は署名値を共有領域１２３から読み出す（ステップＳ９１７）。そして、ノンセキュアＯＳ部５００またはノンセキュアアプリケーションは、必要に応じて公開鍵を使って署名の値を検証してもよい（ステップＳ９１８）。この署名検証は必ずしも情報処理装置１００で行う必要はなく、公開鍵を持つネットワーク上で接続された装置の上で行ってもよい。
【０２１０】
以上のような処理を行った場合の効果を以下で説明する。通常ステップＳ９１２においては、ハッシュ値格納部３１１には実行モジュール６００のハッシュ値が格納されている。ここで、データの暗号化を指示した実行モジュール６００とは別の実行モジュール６００がロードされており、復号を試みたとする。この時、ハッシュ値格納部３１１にはデータの暗号化を指示した実行モジュール６００とは異なる値が格納されているため、平文の秘密鍵を取得する事はできない。これは実行モジュール６００が情報処理装置１００の電源オフ時に二次記憶部１０７に格納されており、二次記憶部１０７を物理的に取り外して外部機器で実行モジュール６００が改ざんされるといった攻撃に対しては有用である。
【０２１１】
実行モジュール６００が改ざんされた場合、ハッシュ値格納部３１１にはオリジナルの実行モジュール６００とは異なるハッシュ値が格納される事になり、この改ざんされたモジュールで復号は失敗するからである。また、仮想ＴＰＭ部３１０の共通鍵の値を情報処理装置１００毎に異なる値にしておけば、もし他の情報処理装置で実行モジュール６００が実行されており、暗号化秘密鍵を情報処理装置で復号を試みたとしても、仮想ＴＰＭ部３１０の共通鍵の値が一致せず、平文の秘密鍵を取得する事は出来ない。すなわち、秘密鍵を暗号化した情報処理装置で、秘密鍵を暗号化した実行モジュールしか復号できないようにすることができる。
【０２１２】
なお、秘密鍵生成フェーズと署名計算フェーズの間で情報処理装置１００が再起動してもよい。その場合、実行モジュール６００はメインメモリ部１０４からアンロードされる。しかし、署名計算フェーズの前に図２９または図３１の手順に従って実行モジュール６００が再びロードされ、ハッシュ値格納部３１１に実行モジュール６００のハッシュ値が格納される。
【０２１３】
（変形例１１）
図３５は図３２の別例である。セキュアモニタ部２００に割り込み設定部２０５、モニタハンドラ部２０４と、セキュアＯＳ部３００にタイマハンドラ部３８１を備えている点が図３２とは異なる。
【０２１４】
割り込み設定部２０５は、メインプロセッサ部１０１でタイマー割り込みが発生した場合に、モニタハンドラ部２０４を呼び出すようにメインプロセッサ部１０１に設定を行う。この設定処理はセキュアモニタ部２００の初期化処理時の一処理として実行される。
【０２１５】
モニタハンドラ部２０４は、メインプロセッサ部１０１でタイマー割り込みが発生した場合に呼び出される。モニタハンドラ部２０４はもし現在の状態がノンセキュアモードであるならばノンセキュアＯＳ部５００のコンテキストを保存し、状態をセキュアモードに切り替える処理を行う。その後、処理をセキュアＯＳ部３００のタイマハンドラ部３８１に引き継ぐ。
【０２１６】
タイマハンドラ部３８１はタイマー割り込みが発生すると遷移命令呼び出し部３５０でＯＳ間遷移を実行させる。
【０２１７】
図１８で述べたようにメインプロセッサ部１０１はタイマー割り込みを検出することができるが、図３５の構成ではセキュアＯＳ部３００で実行モジュールを実行中にメインプロセッサ部１０１によってタイマー割り込みが発生すると、実行モジュールの処理を中断してノンセキュアＯＳ部５００に遷移させる。
【０２１８】
すなわち、実行モジュールを処理している最中にタイマー割り込みが発生すると、メインプロセッサ部１０１は実行モジュールの処理を強制的に中断させ、セキュアモニタ部２００のモニタハンドラ部２０４に遷移させる。モニタハンドラ部２０４はセキュアＯＳ部３００のタイマハンドラに処理を移し、セキュアＯＳ部３００のタイマハンドラは遷移命令呼び出し部３５０を実行する。これにより、ＯＳ切替部２０２はセキュアＯＳ部３００のコンテキストを保存し、ノンセキュアＯＳ部５００に遷移させる。なお、タイマーの間隔が短い場合、タイマー割り込みが発生するたびにこの判断処理を行う必要はない。たとえば、タイマー割り込みがＮ回発生してそのうち１回に対して上記の判断処理を行うようにしてもよい。このようにＮ回目が来たのかどうか、すなわちタイムアウトしたかどうかを判断するようにしてもよい。
【０２１９】
このようにすることで、ノンセキュアＯＳ部５００の処理を長時間中断させる事を防ぐことができる。たとえば、公開鍵暗号アルゴリズムに基づく公開鍵ペアを生成する処理は複雑であるため、実行モジュールの処理に長時間かかる可能性がある。図３２に示した構成では、この間、ノンセキュアＯＳ部５００は処理を中断させたままの状態になる。もしノンセキュアＯＳ部５００またはノンセキュアアプリケーションでセンサーによるデータ取得処理やネットワーク通信など定期的な処理を実行する必要がある場合、実行モジュールを実行中はデータ取得やネットワーク通信ができなくなってしまう。これを防ぐために、実行モジュールが実行可能な時間をタイマーにより制限することで、ノンセキュアＯＳ部５００が長時間停止した状態に置かれる事を防ぐことができる。
【０２２０】
（変形例１２）
図３６は図３２の別例である。セキュアＯＳ部３００にモジュール検証部３９９を備えている点が図３２と異なる。図３６では実行モジュールに署名が添付されており、アプリ実行部３９６は実行モジュールの実行に先立ち、実行モジュールに添付された署名を検証し、検証が成功する場合のみ実行モジュールを実行させる。
【０２２１】
図３２の実行モジュールの形式はモジュールの実行に必要な実行コード領域と初期値などのデータ領域から構成されている事を想定していた。一方、図３６の実行モジュールの形式は、それらの領域に加えて、実行モジュールに対する署名が付与されている事を想定している。
【０２２２】
この署名に使う秘密鍵は、仮想ＴＰＭ部３１０が管理していてもよいし、不図示の実行モジュール配布サーバなどの外部機器が管理してもよい。
【０２２３】
図３７は図３６の情報処理装置で図３３の実行モジュールを実行する際の処理を示すフロー図である。まず、ノンセキュアＯＳ部５００は、実行モジュールの署名生成に利用した秘密鍵に対応する署名検証用の公開鍵（パラメタ）を実行モジュールと共に共有領域１２３に書きこむ（ステップＳ１００１、Ｓ１００２）。さらに、命令種別として実行モジュール６００の実行命令である事を示す値を共有領域１２３に書きこむ（ステップＳ１００３）。ノンセキュアＯＳ部５００は、ＯＳ間遷移を実行する（ステップＳ１００４）。
【０２２４】
そして、セキュアＯＳ部３００の命令セレクタ部３９７は、共有領域１２３に書きこまれている命令種別を読み出し、今回の遷移後に実行する命令が実行モジュールの実行であることを識別し、実行モジュールロード部３９４とアプリ実行部３９６を呼び出す。セキュアＯＳ部３００の実行モジュールロード部３９４は実行モジュールを共有領域１２３からロードし、セキュア領域１２２に書きこむ（ステップＳ１００５、Ｓ１００６）。そして実行モジュールの実行に先立ち、セキュアＯＳ部３００は、実行モジュールの署名を公開鍵によって検証する（ステップＳ１００７）。この署名は、ＰＫＩ(Ｐｕｂｌｉｃ  Ｋｅｙ  Ｉｎｆｒａｓｔｒｕｃｔｕｒｅ)によってチェーン構造の証明書になっていてもよい。すなわち、ルートとなる公開鍵が仮想ＴＰＭ部３１０の秘密鍵格納部３１３に格納されており、この公開鍵によってチェーンされた証明書を検証し、すべてのチェーンを検証することができたならば、その実行モジュールの検証が成功するというようになっていてもよい。
【０２２５】
検証が失敗した場合（ステップＳ１００８：Ｎｏ）、セキュアＯＳ部３００は、実行モジュールをセキュア領域１２２から削除し（ステップＳ１０１１）、ＯＳ間遷移を実行してノンセキュアＯＳ部５００に戻る（ステップＳ１０１２）。この場合は実行モジュールは実行されない。
【０２２６】
検証が成功した場合（ステップＳ１００８：Ｙｅｓ）、ハッシュ計算部３２０は、実行モジュールのハッシュ値を計算し、仮想ＴＰＭ部３１０に格納する（ステップＳ１００９）。以後の処理は図３２と同じでよい。
【０２２７】
このように実行モジュールに署名を付与する事で、実行モジュールが正当な配布者によって配布されたものであり、改ざんされていないことを確認する事ができる。たとえば、実行モジュールの署名の付与を情報処理装置が行うならば、情報処理装置で確認済みの実行モジュールしか実行されないように制限することができる。これは、実行モジュールが二次記憶部１０７で改ざんされる危険性のある場合には特に有用である。
【０２２８】
なお、この発明は上記した実施の形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を種々変形して具体化することができる。また、上記した実施の形態に開示されている複数の構成要素を適宜に組み合わせることにより、種々の発明を形成することができる。例えば、実施の形態に示される全構成要素から幾つかの構成要素を削除しても良いものである。さらに、異なる実施の形態に係る構成要素を適宜組み合わせても良いものである。
【符号の説明】
【０２２９】
１  バス
２  バス
１００  情報処理装置
１０１  メインプロセッサ部
１０２  アドレス空間制御部
１０３  メモリ制御部
１０４  メインメモリ部
１０５  ブートＲＯＭ部
１０６  二次記憶部制御部
１０７  二次記憶部
１０８  ブリッジ部
１０９  Ｉ／Ｏ処理部
１２１  ノンセキュア領域
１２２  セキュア領域
１２３  共有領域
２００  セキュアモニタ部
２０１  ローダー部
２０２  ＯＳ切替部
２０３  セキュアモニタメモリ設定部
２０４  モニタハンドラ部
２０５  割り込み設定部
２０６  モニタハッシュ計算部
３００  セキュアＯＳ部
３１０  仮想ＴＰＭ部
３１１  ハッシュ値格納部
３１２  署名計算部
３１３  秘密鍵格納部
３１４  データ暗号化部
３１５  データ復号化部
３２０  ハッシュ計算部
３３０  メモリリード部
３４０  メモリライト部
３５０  遷移命令呼び出し部
３６０  期待値格納部
３７０  ハッシュ値検証部
３８０  ハッシュ値送信部
３８１  タイマハンドラ部
３９０  アボートハンドラ部
３９１  コア設定部
３９２  タイマー割り込みハンドラ部
３９３  メモリ設定部
３９４  実行モジュールロード部
３９５  モジュール署名生成部
３９６  アプリ実行部
３９７  命令セレクタ部
３９８  パラメタロード部
３９９  モジュール検証部
４００  ブートローダ部
４０１  起動部
４０２  メモリライト部
４０３  ＯＳリード部
４０４  遷移命令呼び出し部
５００  ノンセキュアＯＳ部
５０１  通信処理部
５０２  コンテンツ受信部
５０３  ＤＲＭ処理部
５０４  コンテンツ再生部
５０５  ハッシュ値送信部
５０６  パラメタ取得部
５０７  実行モジュール取得部
５０８  共有領域ライト部
５０９  共有領域リード部
５１０  検証処理部
５１１  検証鍵管理部
６００  実行モジュール
６０１  データ生成部
６０２  データ暗号化依頼部
６０３  データ送信依頼部
６０４  データ受信依頼部
６０５  データ復号化依頼部
６０６  第２データ処理部
【図１】
2014191509.tif 000003
【図２】
2014191509.tif 000004
【図３】
2014191509.tif 000005
【図４】
2014191509.tif 000006
【図５】
2014191509.tif 000007
【図６】
2014191509.tif 000008
【図７】
2014191509.tif 000009
【図８】
2014191509.tif 000010
【図９】
2014191509.tif 000011
【図１０】
2014191509.tif 000012
【図１１】
2014191509.tif 000013
【図１２】
2014191509.tif 000014
【図１３】
2014191509.tif 000015
【図１４】
2014191509.tif 000016
【図１５】
2014191509.tif 000017
【図１６】
2014191509.tif 000018
【図１７】
2014191509.tif 000019
【図１８】
2014191509.tif 000020
【図１９】
2014191509.tif 000021
【図２０】
2014191509.tif 000022
【図２１】
2014191509.tif 000023
【図２２】
2014191509.tif 000024
【図２３】
2014191509.tif 000025
【図２４】
2014191509.tif 000026
【図２５】
2014191509.tif 000027
【図２６−１】
2014191509.tif 000028
【図２６−２】
2014191509.tif 000029
【図２７】
2014191509.tif 000030
【図２８】
2014191509.tif 000031
【図２９】
2014191509.tif 000032
【図３０】
2014191509.tif 000033
【図３１】
2014191509.tif 000034
【図３２】
2014191509.tif 000035
【図３３】
2014191509.tif 000036
【図３４】
2014191509.tif 000037
【図３５】
2014191509.tif 000038
【図３６】
2014191509.tif 000039
【図３７】
2014191509.tif 000040