(57)【要約】      （修正有）【課題】プログラムの先頭アドレスが記憶されているリセットベクタを検証する情報処理装置及びデータ検証方法を提供する。【解決手段】情報処理装置において、プログラムの先頭アドレスを固定アドレスに記憶し，かつ，先頭アドレスからプログラムを記憶しているメモリと，リセットが解除されるとメモリの固定アドレスを参照し，プログラムの線津アドレスを読み出し，読み出された先頭アドrすからプログラムを読み出して実行する第１のプロセッサと，メモリに記憶されているプログラムおよびメモリの固定アドレスに記憶されている先頭アドレスを検証する第２のプロセッサとを有する。【選択図】なし【特許請求の範囲】
【請求項１】
プログラムの先頭アドレスを固定アドレスに記憶し、かつ、前記先頭アドレスから前記プログラムを記憶しているメモリと、
リセットが解除されると前記メモリの前記固定アドレスを参照し、前記プログラムの前記先頭アドレスを読み出し、前記読み出された先頭アドレスから前記プログラムを読み出して実行する第１のプロセッサと、
前記メモリに記憶されている前記プログラムおよび前記メモリの前記固定アドレスに記憶されている前記先頭アドレスを検証する第２のプロセッサと、
を有することを特徴とする情報処理装置。
【請求項２】
前記第２のプロセッサは、前記検証によって前記メモリに記憶されている前記プログラムおよび前記メモリの前記固定アドレスに記憶されている前記先頭アドレスが正真であると判定した場合に、前記第１のプロセッサのリセットを解除することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記第２のプロセッサは、前記プログラムおよび前記先頭アドレスが少なくとも記憶される、前記メモリの所定の範囲のアドレスに記憶されたデータ列を検証することで、前記プログラムおよび前記先頭アドレスを検証することを特徴とする請求項１に記載の情報処理装置。
【請求項４】
前記検証されるデータ列は、前記プログラムおよび前記先頭アドレスだけでなく、前記固定アドレスから前記先頭アドレスまで連続するアドレスに記憶されたデータも含まれることを特徴とする請求項３に記載の情報処理装置。
【請求項５】
前記メモリの前記固定アドレスは、前記第１のプロセッサのリセットベクタであることを特徴とする請求項１に記載の情報処理装置。
【請求項６】
前記メモリは、前記プログラムおよび前記先頭アドレスの署名を記憶し、
前記第２のプロセッサは、
前記メモリに記憶されている前記プログラムおよび前記先頭アドレスの署名を計算する計算手段を有し、
前記メモリから読み出した署名と前記計算された署名とが一致しているか否かに基づいて、前記検証を行うことを特徴とする請求項１に記載の情報処理装置。
【請求項７】
前記メモリは、前記プログラムおよび前記先頭アドレスの署名を秘密鍵で暗号化された状態で記憶し、
前記第２のプロセッサは、
前記暗号化された状態の前記署名を前記秘密鍵と対になる公開鍵で復号化する復号化手段を有し、
前記メモリから読み出して復号化された署名と、前記計算された署名とが一致しているか否かに基づいて、前記検証を行うことを特徴とする請求項６に記載の情報処理装置。
【請求項８】
前記署名とは、ハッシュ値であることを特徴とする請求項６または７に記載の情報処理装置。
【請求項９】
前記第２のプロセッサは、所定のプログラムにしたがって前記検証を行うことを特徴とする請求項１に記載の情報処理装置。
【請求項１０】
前記第２のプロセッサは、前記所定のプログラムにしたがって前記検証を行った後、前記所定のプログラムとは別のプログラムを実行することを特徴とする請求項９に記載の情報処理装置。
【請求項１１】
前記第１のプロセッサは、前記第２のプロセッサによって前記検証が行われた後、前記第２のプロセッサの起動モードを変更し、前記第２のプロセッサをリセットおよび該リセットの解除を行い、
前記第２のプロセッサは、前記第１のプロセッサによってリセットが解除されると、変更された起動モードにしたがって、前記別のプログラムを実行することを特徴とする請求項１０に記載の情報処理装置。
【請求項１２】
プログラムの先頭アドレスを固定アドレスに記憶し、かつ、前記先頭アドレスから前記プログラムを記憶しているメモリと、リセットが解除されると前記メモリの前記固定アドレスを参照し、前記プログラムの前記先頭アドレスを読み出し、前記読み出された先頭アドレスから前記プログラムを読み出して実行する第１のプロセッサと、を有する情報処理装置において、
前記メモリに記憶されている前記プログラムおよび前記メモリの前記固定アドレスに記憶されている前記先頭アドレスを検証する工程を有することを特徴とするデータ検証方法。
【請求項１３】
前記検証によって前記メモリに記憶されている前記プログラムおよび前記メモリの前記固定アドレスに記憶されている前記先頭アドレスが正真であると判定した場合に、前記第１のプロセッサのリセットを解除する工程を有することを特徴とする請求項１２に記載のデータ検証方法。
【請求項１４】
前記検証する工程は、前記プログラムおよび前記先頭アドレスが少なくとも記憶される、前記メモリの所定の範囲のアドレスに記憶されたデータ列を検証することで、前記プログラムおよび前記先頭アドレスを検証することを特徴とする請求項１２に記載のデータ検証方法。
【請求項１５】
前記検証されるデータ列は、前記プログラムおよび前記先頭アドレスだけでなく、前記固定アドレスから前記先頭アドレスまで連続するアドレスに記憶されたデータも含まれることを特徴とする請求項１４に記載のデータ検証方法。
【請求項１６】
前記メモリの前記固定アドレスは、前記第１のプロセッサのリセットベクタであることを特徴とする請求項１２に記載のデータ検証方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、データ検証方法に関するものである。
【背景技術】
【０００２】
コンピュータのシステムの脆弱性をついて、コンピュータ上で動作するソフトウェアを改ざんし、コンピュータを悪用する攻撃が問題となっている。
【０００３】
特許文献１は、第１のＣＰＵ、第２のＣＰＵ、第２のＣＰＵによって実行されるプログラムを記憶する不揮発メモリを有する情報処理装置を開示する。この情報処理装置では、第１のＣＰＵが、第２のＣＰＵによって実行されるプログラムを不揮発メモリから読み出して、そのプログラムの改ざんの有無を検証し、その検証の結果に応じて、そのプログラムを第２のＣＰＵに出力する。第２のＣＰＵは、改ざんがなされていないプログラムを実行するので、セキュリティを向上させることができる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】国際公開ＷＯ０９／０１３８２５
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ＣＰＵはリセットが解除されることで動作を開始する。ＣＰＵは、リセットが解除されると、特定のアドレスを参照する。この特定のアドレスには、ブートプログラムが格納されているアドレスが記載されている。そして特定のアドレスを参照したＣＰＵは、その特定のアドレスに記載されたアドレスをさらに参照し、そのアドレスに格納されているブートプログラムを実行する。
【０００６】
特許文献１の開示する技術では、ＣＰＵが実行するプログラムを外部メモリから読み出して改ざんの有無を検証するシステムにおいて、そのプログラムを検証する。しかしながら、上述した特定アドレスに記載されたアドレスが正しいものであるかを検証していない。その結果、特定アドレスに記載されたアドレスが正しいものでなかった場合、本来実行すべきプログラムとは別のプログラムが実行されてしまう。
【課題を解決するための手段】
【０００７】
本発明の情報処理装置は、プログラムの先頭アドレスを固定アドレスに記憶し、かつ、前記先頭アドレスから前記プログラムを記憶しているメモリと、リセットが解除されると前記メモリの前記固定アドレスを参照し、前記プログラムの前記先頭アドレスを読み出し、前記読み出された先頭アドレスから前記プログラムを読み出して実行する第１のプロセッサと、前記メモリに記憶されている前記プログラムおよび前記メモリの前記固定アドレスに記憶されている前記先頭アドレスを検証する第２のプロセッサと、を有することを特徴とする。
【発明の効果】
【０００８】
本発明によれば、システムとしてのセキュリティを向上させることができる。
【図面の簡単な説明】
【０００９】
【図１】実施形態１の複合機のハードウェア構成図
【図２】複合機のソフトウェア構成図
【図３】起動時の動作を示す模式図
【図４】ＣＰＵ１１１が実行する起動シーケンスのフローチャート
【図５】ＣＰＵ１０１が実行する起動シーケンスのフローチャート
【図６】フラッシュメモリ１４５の構成を示す図
【発明を実施するための形態】
【００１０】
以下、添付図面を参照して本発明の実施形態を詳しく説明する。尚、本発明は、以下の実施形態のみに限定されるものでなく、また本実施形態で説明されている特徴の組み合わせの全てが本発明の解決手段に必須のものとは限らない。尚、実施形態に係るデータ検証方法を実行する情報処理装置として複合機（デジタル複合機／ＭＦＰ／Ｍｕｌｔｉ  Ｆｕｎｃｔｉｏｎ  Ｐｅｒｉｐｈｅｒａｌ）を例に説明する。しかしながら適用範囲は複合機に限定はせず、情報処理装置であればよい。
【００１１】
（実施形態１）
図１は実施形態１に係る複合機１０のハードウェア構成を説明するブロック図である。
【００１２】
コントローラ２０は、複合機１０の制御を行うための後述する１０１〜１３７のハードウェアモジュールで構成される。本実施形態では半導体チップとして構成されているものとして説明する。
【００１３】
クロック生成部３０は、クロックを生成して複合機１０内部の各モジュールに適した周波数のクロック信号（外部クロック）を供給する。本実施形態ではクロック生成部３０は、クロック信号３１をコントローラ２０内のＰＬＬ（Ｐｈａｓｅ  Ｌｏｃｋｅｄ  Ｌｏｏｐ）１２３に供給する。周波数はクロック制御信号３２によって変更可能である。
【００１４】
リセット生成部４０は、リセット信号を生成して複合機１０内部の各モジュールへリセットを掛けたり解除したりする半導体チップである。本実施形態ではコントローラ２０へ供給するリセット信号４１しか図示していないがスキャナ１４１やプリンタ１４２などのモジュールにも接続されているものとする。複合機１０の電源が供給されると一定時間（例えば供給電源電圧が安定するまで）リセット信号４１のリセット状態を保持した後にリセット信号４１を解除状態にしてコントローラ２０のリセットを解除する。リセット信号４１がアサートされている状態がリセット信号４１のリセット状態であり、リセット信号４１がデアサートされている状態がリセット信号４１の解除状態である。コントローラ２０のリセットが解除されると、コントローラ２０内のモジュールが動作を開始する。
【００１５】
ＣＰＵ１０１は、複合機１０のソフトウェアプログラムを実行し、装置全体の制御を行う。
【００１６】
ＲＡＭ１０２は、ランダムアクセスメモリで、ＣＰＵ１０１が複合機１０を制御する際に、プログラムや一時的なデータの格納などに使用される。
【００１７】
ＨＤＤ１４４は、ハードディスクドライブで一部のアプリケーション、各種データを格納する。このＨＤＤ１４４は、ＣＰＵ１０１が実行するＪａｖａ（登録商標）プログラム２１４を格納している。
【００１８】
フラッシュメモリ１４５は、複合機１０の固定パラメータ等を格納している。またフラッシュメモリ１４５は、ＣＰＵ１０１が実行するＢＩＯＳ２１０を格納している。さらにＣＰＵ１０１が実行するローダー２１１・カーネル２１２・Ｎａｔｉｖｅプログラム２１３を格納する。なお、ＨＤＤ１４４とフラッシュメモリ１４５は同一のストレージモジュールであっても良いものとする。
【００１９】
ＣＰＵ１１１は、ＣＰＵ１０１が実行するソフトウェアプログラムの改ざんを検知する改ざん検知ソフトウェアプログラムを実行し、複合機１０の中で一部の制御を行う。
【００２０】
ＲＯＭ１１２はリードオンリーメモリで、前記改ざん検知ソフトウェアプログラムや後述の公開鍵などを格納している。またＲＯＭ１１２は、ＣＰＵ１１１が実行するブートプログラム２０９を格納している。
【００２１】
なおＲＯＭ１１２は、外部からのＩ／Ｆから書き換えられないように論理回路で構成されたＭＡＳＫ  ＲＯＭもしくは製造時に一度だけ書き込みが可能なＯＴＰ（Ｏｎｅ  Ｔｉｍｅ  Ｐｒｏｇｒａｍｍａｂｌｅ）  ＲＯＭで構成されているものとする。
【００２２】
ＲＡＭ１１３は、ランダムアクセスメモリで、ＣＰＵ１１１が複合機１０を制御する際に、プログラムや一時的なデータの格納などに使用される。なおＲＡＭ１０２とＲＡＭ１１３は同一のモジュールであっても良いものとする。
【００２３】
電源制御部１２０は、コントローラ２０内部の各モジュール部に対して電力供給を制御するＩＣ（Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）である。コントローラ２０（複合機１０）の起動時や動作時に、各モジュール部に対して所定の電力を供給したり停止したりすることができる。
【００２４】
クロック制御部１２１は、ＰＬＬ１２３を内部クロック制御信号３３で制御する。これにより、ＰＬＬ１２３は、クロック信号３１の周波数を逓倍し、周波数が逓倍されたクロック信号をコントローラ２０内部の各モジュール部に対して供給する。クロック制御部１２１は、コントローラ２０の起動時や動作時に、ＰＬＬ１２３に対して逓倍の設定を変更することで、ＰＬＬ１２３が各モジュール部に最適な周波数のクロック（内部クロック）を供給するように制御を行う。またクロック制御部１２１は、モジュールごとに個別にクロックをゲートして停止させることができる。
【００２５】
リセット制御部１２２はコントローラ２０内部の各モジュール部に対してリセット制御する。コントローラ２０の起動時や動作時に、各モジュールをリセット状態にしたりリセット解除状態にしたりする制御を行う。
【００２６】
スキャナＩ／Ｆ制御部１３１は、スキャナ１４１による原稿の読み取り制御する。プリンタＩ／Ｆ制御部１３２は、プリンタ１４２による印刷処理などを制御する。パネル制御部１３３は、タッチパネル式の操作パネル１４３を制御し、各種情報の表示、使用者からの指示入力を制御する。
【００２７】
ＨＤＤ制御部１３４は、ＨＤＤ１４４に対してデータを読み書きする制御を行う。例えばＲＡＭ１０２に格納されている画像データをシステムバス１０９経由でＨＤＤ１４４に書きだして格納することができる。
【００２８】
フラッシュメモリ制御部１３５は、フラッシュメモリ１４５に対してデータを読み書きする制御を行う。フラッシュメモリ制御部１３５は、コントローラ２０の起動時にフラッシュメモリ１４５に格納されているプログラムを読みだしてシステムバス１０９経由でＲＡＭ１１３へ展開することができる。
【００２９】
ネットワークＩ／Ｆ制御部１３６は、ネットワーク１４６上の他のデバイスやサーバーとのデータの送受信を制御する。
【００３０】
外部ポート制御部１３７は、コントローラ２０の入出力ポート制御部である。例えば出力ポートを制御することによりＬＥＤ１４７を必要に応じて点灯し、ソフトウェアやハードウェアの異常を外部に伝えることが可能である。
【００３１】
画像処理部１３８は、スキャナ１４１から読み取った画像データをシェーディング補正したり、プリンタ１４２に出力するためにハーフトーン処理やスムージング処理したりする処理部である。
【００３２】
システムバス１０９は、システムバス１０９に接続されている各モジュールを相互に接続する。このシステムバス１０９を介して、ＣＰＵ１０１やＣＰＵ１１１からの制御信号や各装置間のデータ信号が送受信される。
【００３３】
図２は、実施形態１に係る複合機１０が有するソフトウェアモジュールを説明するブロック図である。これらのソフトウェアはＣＰＵ１０１、またはＣＰＵ１１１が実行するものとして説明する。
【００３４】
通信管理部２０７は、ネットワーク１４６に接続されるネットワークＩ／Ｆ制御装置１３６を制御して、ネットワーク１４６を介して外部とデータの送受信を行う。
【００３５】
ＵＩ制御部２０３は、パネル制御部１３３を介して操作パネル１４３への入力を受け取り、入力に応じた処理や操作パネル１４３への画面出力を行う。
【００３６】
ブートプログラム２０９は、複合機１０の電源を入れるとＣＰＵ１１１で実行されるプログラムであり、起動に関わる処理としてコントローラ２０に対して起動シーケンスを実行する。起動シーケンスについては図４を用いて後述する。このブートプログラム２０９は、起動後にＢＩＯＳおよびリセットベクタの改ざん検知を行うＢＩＯＳ・リセットベクタ改ざん検知処理部２０１を有する。
【００３７】
ＢＩＯＳ２１０は、ブートプログラム２０９実行後にＣＰＵ１０１で実行されるプログラムであり、起動に関わる処理を行うほかにローダー２１１の改ざん検知を行うローダー改ざん検知処理部２０２を有する。
【００３８】
ローダー２１１は、ＢＩＯＳ２１０の処理が終わった後にＣＰＵ１０１で実行されるプログラムであり、起動に関わる処理を行うほかにカーネルの改ざん検知を行うカーネル改ざん検知処理部２０４を有する。
【００３９】
カーネル２１２は、ローダー２１１の処理が終わった後にＣＰＵ１０１で実行されるプログラムであり、起動に関わる処理を行うほかにＮａｔｉｖｅプログラム２１３の改ざん検知を行うＮａｔｉｖｅ改ざん検知処理部２０５を有する。
【００４０】
リセットベクタ２１５は、リセットが解除されたＣＰＵ１０１が最初に参照（アクセス）するアドレスである。このアドレスには、次に実行するプログラムの先頭アドレスが記載されている。リセットが解除されたＣＰＵ１０１は、リセットベクタを参照し、このリセットベクタに記載されているアドレス（すなわちプログラムの先頭アドレス）を読み出し、この読み出された先頭アドレスからプログラムを読み出して実行する。なお、ＣＰＵによってはリセットベクタに命令を記述し、その命令を実行して指定のアドレスにアクセスする方式もあるものとする。本実施形態においては前者の方式で説明をおこなう。
【００４１】
Ｎａｔｉｖｅプログラム２１３は、ＣＰＵ１０１で実行されるプログラムであり、複合機１０のＪａｖａプログラム２１４と連携して各機能を提供する複数のプログラムで構成される。この複数のプログラムは、例えばスキャナＩＦ制御部１０６やプリンタＩＦ制御部１０６を制御するプログラムや起動プログラム、ＣＰＵ１１１の再起動プログラムなどを含む。この起動プログラムおよびＣＰＵ１１１の再起動プログラムは、カーネル２１２によってＮａｔｉｖｅプログラムの中から呼び出され、起動処理を行う。ＣＰＵ１１１の再起動プログラムは、ブートプログラムを実行しＢＩＯＳ・リセットベクタ改ざん検知処理を終えたＣＰＵ１１１を改ざん検知処理とは異なる別用途として使うために、その別用途に対応するプログラムをＣＰＵ１１１に実行させる。例えば省電力モード時に外部ポートの割り込みを監視する監視プログラムが、改ざん検知処理を終えたＣＰＵ１１１によって実行されるよう、ＣＰＵ１０１は、ＣＰＵ１１１の再起動プログラムを実行する。ここで省電力モードとは、ＣＰＵ１１１と外部ポート制御部、システムバス１０９、ネットワークＩ／Ｆ制御部１３６、操作パネル１４３以外の制御部、処理部を通常時の稼働状態から安全に電源遮断もしくはクロック停止させた状態を指すものとする。ＣＰＵ１１１は例えばセンサーなどの信号が入ることで外部制御部１３７から外部ポートの割り込みを検知すると省電力モードから通常モードに復帰させる処理を行う。前述した電源遮断もしくはクロック停止した制御部、処理部を安全に稼働状態に移行させるものとする。ＣＰＵ１１１が割り込み監視をすることでＣＰＵ１０１に対してＣＰＵ１１１が小規模で待機電力が小さい場合に通常動作時の処理を行うＣＰＵ１０１の電源遮断もしくはクロック停止をさせて省電力の効果を上げることが可能となる。またＮａｔｉｖｅプログラム２１３は、プログラムの中の一つとしてＪａｖａプログラムの改ざん検知を行うＪａｖａプログラム改ざん検知処理部を有する。
【００４２】
Ｊａｖａプログラム２１４は、ＣＰＵ１０１で実行されるプログラムであり、複合機１０のＮａｔｉｖｅプログラム２１３と連携して各機能を提供するプログラム（たとえば操作パネル１４３に画面を表示するプログラム）である。
【００４３】
次に複写機１０の起動シーケンスについて図３を用いて説明する。
【００４４】
図３（ａ）は改ざん検知を行わずに複合機１０が起動する順序を示す起動シーケンス模式図である。ブートプログラム２０９がＢＩＯＳ２１０を起動し、ＢＩＯＳ２１０がローダー２１１を起動し、ローダー２１１がカーネル２１２を起動し、カーネル２１２がＮａｔｉｖｅプログラム２１３の中から起動プログラムを起動する。起動プログラムの中でＪａｖａプログラム２１４が起動され、以降はＮａｔｉｖｅプログラム２１３とＪａｖａプログラム２１４が連携して複合機１０の有する各機能を提供する。
【００４５】
図３（ｂ）はブートプログラム２０９からＢＩＯＳ２１０およびリセットベクタ２１５、ローダー２１１、カーネル２１２、Ｎａｔｉｖｅプログラム２１３、Ｊａｖａプログラム２１４が改ざん検知を行いながら起動する処理の流れを表した起動シーケンスを示す。また、図３（ｂ）は各プログラムの保存場所、デジタル署名（以下署名と呼ぶ）と公開鍵の保存場所を表した模式図でもある。
【００４６】
署名とは、例えば正規のプログラム（データ列）を所定のハッシュ関数によってハッシュ値に変換し、公開鍵に対応する秘密鍵でハッシュ値を暗号化したものである。この暗号化されたハッシュ値を公開鍵で復号化することで正規のプログラムのハッシュ値を計算し、改ざんの有無の検証対象であるプログラムを前述のハッシュ関数によってハッシュ値に変換し、これら２つのハッシュ値を比較する。２つのハッシュ値が等しければ検証対象のプログラムは正規のプログラムから改ざんされていないと判定できる。またもし２つのハッシュ値が異なれば検証対象のプログラムは正規のプログラムから改ざんされていると判定できる。このように署名を用いて検証対象のプログラムの改ざん有無を調べる方法を、以降では、署名検証と呼ぶ。また、プログラムが改ざんされていないことを、署名検証に成功すると呼び、プログラムが改ざんされていることを、署名検証に失敗すると呼ぶ。本実施形態では、プログラムの改ざん有無を調べる方法として、このような署名および公開鍵を用いる方法を採るが、改ざん有無を調べる他の方法でも良い。
【００４７】
図６（ａ）はフラッシュメモリ１４５のメモリ構成図である。本実施形態では、ＢＩＯＳ２１０とリセットベクタ２１５とが少なくとも記憶される所定の範囲のアドレス０ｘ００００＿００００（番地）〜０ｘ０００１＿ＦＦＦＦ（番地）を１つのハッシュ計算対象とし、その範囲のサイズを予め固定したものとして説明する。このアドレス範囲は、リセットベクタ２１５が記憶されるアドレス（０番地）からＢＩＯＳ２１０の末尾のアドレスまでの連続アドレスが少なくとも含まれる。またこのアドレス範囲には、リセットベクタ２１５およびＢＩＯＳ２１０以外のデータ列も記憶される。ハッシュ計算対象を１つにまとめ固定サイズにすることでブートプログラム２０９の処理が単純化されるメリットがある。一方でリセットベクタ２１５とＢＩＯＳ２１０が離れた配置にすると無駄なデータ列のハッシュ計算をしなければならないし、サイズに収めるようにＢＩＯＳ２１０を作成しなければならない制約が出るなどのデメリットがある。ＣＰＵ１０１のリセットベクタ２１５がフラッシュメモリ１４５の０ｘ００００＿００００〜０ｘ００００＿３ＦＦＦ番地内に設定されているものとする。前述したようにＣＰＵ１０１がリセット解除されると０ｘ００００＿００００番地を参照する。システムによっては０ｘＦＦＦＦ＿００００番地に配置されているものもある。このリセットベクタ領域には例外ハンドラ（リセットハンドラ）とＩＳＲ（割り込みサービスルーチン）のアドレス（プログラムの先頭アドレス）が記載されている。リセットが解除されたＣＰＵ１０１は、リセットベクタ領域を参照し、リセットベクタに記載されたアドレスからプログラムを実行できるようになっている。図６（ａ）においては飛び先アドレスが０ｘ０００１＿００００番地に設定されているものである。リセットが解除されたＣＰＵ１０１は、リセットハンドラにしたがって飛び先ジャンプする命令を実行する。するとＣＰＵは、０ｘ０００１＿００００〜０ｘ０００１＿ＦＦＦＦ番地に格納されているＢＩＯＳ２１０を実行する。
【００４８】
図６（ｂ）は、フラッシュメモリ１４５上のＢＩＯＳ・リセット署名３０２の構成図である。この署名３０２は、リセットベクタ領域２１５からＢＩＯＳ２１０までの、連続するメモリ領域（アドレス）に記憶されたデータ列のハッシュ値を、公開鍵に対応する秘密鍵で暗号化したものである。すなわち、ＢＩＯＳ２１０と、このＢＩＯＳ２１０の先頭アドレスが記載されているリセットベクタ２１５を含むデータ列のハッシュ値が、署名３０２として、秘密鍵で暗号化された状態でフラッシュメモリ１４５に記憶されている。ＣＰＵ１１１は、秘密鍵で暗号化されたこのハッシュ値を公開鍵で復号化することで、正規のプログラム（ＢＩＯＳ２１０）とリセットベクタに記載されるべき正規のアドレス（ＢＩＯＳ２１０の先頭アドレス）のハッシュ値を取得する。そしてＣＰＵ１１１は、改ざんの有無の検証対象であるフラッシュメモリ１４５に現在格納されているプログラム（ＢＩＯＳ２１０）とリセットベクタ２１５に現在記載されているアドレスとを含むデータ列のハッシュ値を計算する。そしてＣＰＵ１１１は、これら２つのハッシュ値を比較する。以上によって、ＢＩＯＳ２１０およびリセットベクタ２１５に記載されているアドレスの検証がＣＰＵ１１１によって行われる。
【００４９】
なお、ハッシュ計算対象範囲内の例えば図６（ｃ）のように格納リセットベクタ領域とＢＩＯＳの空き領域０ｘ００００＿８０００〜０ｘ００００＿８１ＦＦにリセットベクタおよびＢＩＯＳの各先頭アドレスおよびサイズを記憶する。そしてＣＰＵ１１１がブートプログラム２０９でその先頭アドレスおよびサイズを読み込んで必要な領域のデータ列をハッシュ値に変換するようにしても良いものとする。
【００５０】
ブートプログラム２０９にはＢＩＯＳ署名検証用の公開鍵３００、ＢＩＯＳ２１０にはＢＩＯＳ・リセットベクタ署名３０２とローダー検証用公開鍵３０３、ローダー２１１にはローダー署名３０４とカーネル検証用公開鍵３０５が含まれているものとする。また、カーネル２１２にはカーネル署名３０６とＮａｔｉｖｅプログラム検証用公開鍵３０７、Ｎａｔｉｖｅプログラム２１３にはＮａｔｉｖｅプログラム署名３０８とＪａｖａプログラム検証用公開鍵３０９が含まれているものとする。さらにＪａｖａプログラム２１４にはＪａｖａプログラム署名３１０が含まれているものとする。これらの公開鍵と署名はあらかじめ複合機１０出荷前にプログラムに対して付与されたものとする。
【００５１】
改ざん検知処理部２０１、２０２、２０４〜２０６が次のプログラムが改ざんされているかどうかを検証し、改ざんされていなければ次のプログラムを起動する。このようにプログラムの改ざん検知および起動を順次行う起動シーケンスにしたがって複合機１０は起動する。
【００５２】
ここで、本実施形態の特徴である前記起動シーケンスにおいて改ざん検知プログラムが安全にＣＰＵ１０１を起動させる方法について図４、図５を用いて説明をする。
【００５３】
図４はＣＰＵ１１１が実行する起動シーケンスの処理のフローチャートであり、図５はＣＰＵ１０１が実行する起動シーケンスの処理のフローチャートである。
【００５４】
本実施形態では初期状態においては次の設定で動作してから図４のフローチャートの処理が実行されるものとする。
【００５５】
複合機１０の電源が入ると電源制御部１２０は、コントローラ２０の各部に電力を供給するように制御を行う。
【００５６】
またクロック制御部１２１は、電力が供給されると、クロック制御信号３２をクロック生成部３０に出力することで、クロック生成部３０の発振器もしくは振動子にクロック信号３１を生成させるように制御する。またクロック制御部１２１は、内部クロック制御信号３３をＰＬＬ１２３に出力することで、ＰＬＬ１２３に所望のコントローラ２０の内部クロックを生成させるように制御する。
【００５７】
次にリセット生成部４０は、リセット信号４１を介してリセット制御部１２２に対するリセットを解除する。
【００５８】
リセット制御部１２２に対するリセットが解除されると、まずリセット制御部１２２は、システムバス１０９、ＲＯＭ１１２、ＣＰＵ１１１、フラッシュメモリ制御部１３５、フラッシュメモリ１４５のリセットを解除する。このときはまだ、ＣＰＵ１０１はリセット状態のままである。またＣＰＵ１１１のリセットベクタは、ＲＯＭ１１２のアドレスである。すなわち、ＣＰＵ１１１のリセットが解除されるとＣＰＵ１１１は、ＲＯＭ１１２に記憶されているプログラムを実行する。ＣＰＵ１０１のリセットベクタは、フラッシュメモリ１４５のアドレスであり、ＣＰＵ１０１のリセットが解除されると、リセットベクタをよむ。ＣＰＵ１０１は、リセットベクタに書かれたアドレスに飛びフラッシュメモリ１４５に記憶されているＢＩＯＳプログラムを実行する。
【００５９】
以下にＳ４０１〜Ｓ４０８はＣＰＵ１１１が実行する起動シーケンスを図４に沿って説明する。すなわちＣＰＵ１１１が実行する図２に示されるソフトウェアモジュールによって以下の処理が行われる。この起動シーケンスの特徴は、Ｓ４０５である。すなわち、プログラムの改ざんの有無を判定する判定処理（この処理を以降、改ざん検知処理と呼ぶ）においてプログラム（ＢＩＯＳ２１０）およびこのプログラムの先頭アドレスが記載されているべきリセットベクタの署名検証を実行するようにする。
【００６０】
Ｓ４０１においてＣＰＵ１１１のリセットが解除されると、ＣＰＵ１１１は、始めにＲＯＭ１１２に書かれているブートプログラムを実行する。
【００６１】
Ｓ４０２においてＣＰＵ１１１は、ブートプログラムに従って電源制御を行う。ここでは改ざん検知を行うために必要なコントローラ２０内の一部のモジュールのみに電源を供給するように制御を行う。なお、本実施形態では改ざん検知処理時に必要な次のモジュールには少なくとも電源を供給する。クロック制御部１２１、リセット制御部１２２、ＰＬＬ１２３、電源制御部１２０、ＣＰＵ１０１、フラッシュメモリ１４５、ＲＡＭ１０２に電力が供給される。また、ＣＰＵ１１１、ＲＯＭ１１２、ＲＡＭ１１３、ＨＤＤ制御部１３４、フラッシュメモリ制御部１３５、外部ポート制御部１３７に電力が供給される。
【００６２】
Ｓ４０３においてＣＰＵ１１１は、ブートプログラムに従って以下のクロック制御を行う。コントローラ２０の起動完了後にコントローラ２０内の各モジュールの動作周波数は複合機１０の製品仕様に応じて異なる。クロック制御部１２１は、クロック制御信号３２によってクロック生成部３０に対して、所望のクロック信号３１を供給するように指示する。なお、外部クロックを変更した場合は水晶振動子や水晶発振器が安定するまで一定時間待つ必要がある。
【００６３】
さらにクロック制御部１２１は、内部クロック制御信号３３によってＰＬＬ１２３に対して、コントローラ２０内の必要なモジュールに対して供給される内部クロックの周波数を所望の周波数に設定する。こうすることでＣＰＵ１１１やシステムバス１０９、フラッシュメモリ制御部１３５の処理を行うことが可能となる。
【００６４】
なおクロック制御部１２１は、内部クロックの周波数を変更するために、次の処理を行う。すなわちクロック制御部１２１は、ＰＬＬ１２３からのクロックを一旦ゲートして、ＰＬＬ１２３をバイパスした外部クロックに切り替え、ＰＬＬ１２３で生成される内部クロックが安定してから、所望の内部クロックを各モジュールに供給する制御を行う。ここで内部クロックを切り替える制御はＣＰＵ１１１へのクロック供給も停止してしまうのでクロック制御部１２１の内部にハードシーケンサを設けて行うものとする。
【００６５】
クロック制御部１２１は、ＣＰＵ１０１、フラッシュメモリ１４５、ＲＡＭ１０２、ＣＰＵ１１１、ＲＯＭ１１２、ＲＡＭ１１３、システムバス１０９、ＨＤＤ制御部１３４、フラッシュメモリ制御部１３５に供給されるクロック周波数を所望の周波数に設定する。供給されるクロックの周波数は、供給先のモジュールによって異ならせてよい。
【００６６】
Ｓ４０４においてＣＰＵ１１１は、ブートプログラムに従ってリセット解除を行う。すなわちＣＰＵ１１１は、改ざん検知処理に必要なモジュールのリセットを解除する。具体的にはＲＡＭ１１３、システムバス１０９、ＨＤＤ制御部１３４のリセットが解除される。
【００６７】
Ｓ４０５においてＣＰＵ１１１は、ブートプログラムに従ってＢＩＯＳおよびリセットベクタの署名検証を行う。ブートプログラム２０９に含まれるＢＩＯＳ・リセットベクタ改ざん検知処理部２０１は、フラッシュメモリ１４５からシステムバス１０９を介してＢＩＯＳ２１０およびリセットベクタ２１５に記載されているアドレスをＲＡＭ１１３に読み込む。本実施形態では図６（ｂ）に記載したように固定アドレス０ｘ００００＿００００から０ｘ０００１＿ＦＦＦＦの固定領域を読み込むものとする。次にＢＩＯＳ・リセットベクタ改ざん検知処理部２０１はＢＩＯＳ・リセットベクタ検証用公開鍵３００を用いてＢＩＯＳ・リセットベクタ署名３０２の検証を行う。なお、本実施形態ではＢＩＯＳ２１０とリセットベクタ２１５に記載されているアドレスを一括して検証しているが各々別に検証しても良いものとする。またリセットベクタおよびＢＩＯＳのアドレスおよびサイズは固定でなくても良いものとする。その場合は前述した通りハッシュ計算対象範囲にリセットベクタおよびＢＩＯＳの各先頭アドレスおよびサイズを格納しておき読むものとする。
【００６８】
Ｓ４０６においてＣＰＵ１１１は、ＢＩＯＳ・リセットベクタの署名検証が成功したかを判定する。署名検証の結果、ＢＩＯＳおよびリセットベクタが正規（正真）のものであって改ざんされていない（ハッシュ値と署名の値とが一致する）ならば、署名検証に成功したとして、処理はＳ４０７に進む。ＢＩＯＳもしくはリセットベクタの内容が改ざんされている（ハッシュ値と署名の値とが一致しない）ならば、署名検証に失敗したとして、Ｓ４０８のエラー処理に進む。つまり本実施形態では、リセットベクタが改ざんされた場合でも、Ｓ４０８のエラー処理に進む。
【００６９】
Ｓ４０７においてＣＰＵ１１１は、リセット制御部１２２を制御してＣＰＵ１０１、フラッシュメモリ１４５、ＲＡＭ１０２のリセットを解除し、ブートプログラムの処理を終了する。そして起動シーケンスは後述のＳ５０１へ遷移する。すなわちＣＰＵ１０１がＢＩＯＳ２１０を実行してＢＩＯＳ２１０が起動する。
【００７０】
Ｓ４０８においてＢＩＯＳ・リセットベクタ改ざん検知処理部２０１（ＣＰＵ１１１）は、Ｓ４０６で署名検証に失敗したことを通知するために、外部ポート制御部１３７を制御してＬＥＤ１４７を点灯させ、ブートプログラムの処理を終了する。
【００７１】
以上のシーケンスを実行することでＣＰＵ１０１は改ざんされていないリセットベクタを介してＢＩＯＳ２１０を実行することが可能となる。
【００７２】
以下にＳ５０１〜Ｓ５１０はＣＰＵ１０１が実行する起動シーケンスを図５に沿って説明する。すなわちＣＰＵ１０１が実行する図２に示されるソフトウェアモジュールによって以下の処理が行われる。なお、下記で説明する処理においてプログラム（ローダー２１１、カーネル２１２、Ｎａｔｉｖｅプログラム２１３、Ｊａｖａプログラム２１４）の改ざん検知の有無の判定方法は一例である。プログラムの改ざんを検知する方法であれば他の方法が実行されてもよい。
【００７３】
Ｓ５０１においてＣＰＵ１０１は、リセットが解除されるとリセットベクタを参照（アクセス）するように構成されている。本実施形態ではリセットベクタがフラッシュメモリ１４５になるように設計されている。そのため、リセットが解除されたＣＰＵ１０１は、システムバス１０９を介してリセットベクタを参照し、リセットベクタに記載されているアドレス（ＢＩＯＳ２１０の先頭アドレス）を読み出す。ＣＰＵ１０１は、この読み出したアドレス（ＢＩＯＳ２１０の先頭アドレス）へジャンプし、ＢＩＯＳ２１０をフラッシュから読み込んで実行する。ＢＩＯＳ２１０は起動されると、各種初期化処理を行い、ＢＩＯＳ２１０に含まれるローダー改ざん検知処理部２０２が、フラッシュメモリ１４５から、ローダー２１１とカーネル検証用公開鍵３０５、ローダー署名３０４を、ＲＡＭ１０２に読み込む。ここでの初期化シーケンスは例えばＨＤＤ制御部１３４の初期化を行いＨＤＤへアクセスができるようにする。
【００７４】
Ｓ５０２においてローダー改ざん検知処理部２０２は、ローダー検証用公開鍵３０５を用いてローダー署名３０４の検証を行い、署名検証に成功したか判定する。署名検証に失敗した場合、Ｓ５１０にてローダー改ざん検知処理部２０２は、パネル制御部１３３の初期化を行って操作パネル１４３にエラーメッセージを表示し処理を終了する。署名検証に成功した場合、ローダー改ざん検知処理部２０４は処理を終了し、ＢＩＯＳ２１０がＲＡＭ１０２に読み込まれたローダー２１１を起動する。
【００７５】
Ｓ５０３においてローダー２１１は起動されると、各種初期化処理を行う。ここでの初期化は例えばパネル制御部１３３の初期化を行って操作パネル１４３に起動画面を表示させたりする。また、ローダー２１１に含まれるカーネル改ざん検知処理部２０４が、フラッシュメモリ１４５から、カーネル２１２とＮａｔｉｖｅプログラム検証用公開鍵３０７とカーネル署名３０６を、ＲＡＭ１０２に読み込む。
【００７６】
Ｓ５０４においてカーネル改ざん検知処理２０４は、カーネル検証用公開鍵３０５を用いてカーネル署名３０６の検証を行い、署名検証に成功したか判定する。署名検証に失敗した場合、Ｓ５１０にてカーネル改ざん検知処理部２０４は、操作パネル１４３にエラーメッセージを表示し処理を終了する。署名検証に成功した場合、カーネル改ざん検知処理部２０４は処理を終了し、ローダー２１１がＲＡＭ１０２に読み込まれたカーネル２１２を起動する。
【００７７】
Ｓ５０５においてカーネル２１２は起動されると、各種初期化処理を行う。ここでの初期化は例えばネットワークＩ／Ｆ制御部１３６の初期化を行ってネットワーク１４６との通信が行えるようにする。次にプログラム改ざん検知処理部２０５が、フラッシュメモリ１４５から、Ｎａｔｉｖｅプログラム２１３およびＪａｖａプログラム２１４の両プログラムの検証用公開鍵３０８と、Ｎａｔｉｖｅプログラム署名３０９を、ＲＡＭ１０２に読み込む。
【００７８】
Ｓ５０６においてプログラム改ざん検知処理部２０５は、検証用公開鍵３０８を用いて、Ｎａｔｉｖｅプログラム署名３０９の検証を行い、署名検証に成功したか判定する。署名検証に失敗した場合、Ｓ５１０にてプログラム改ざん検知処理部２０４は、操作パネル１４３にエラーメッセージを表示し処理を終了する。署名検証に成功した場合、プログラム改ざん検知処理部２０５は処理を終了し、Ｎａｔｉｖｅプログラム２１３を起動する。
【００７９】
Ｓ５０７においてＮａｔｉｖｅプログラム２１３のうち、改ざん検知の処理を行うＪａｖａプログラム改ざん検知処理部２０６が起動されると、ＨＤＤ１４４から、Ｊａｖａプログラム２１４とＪａｖａプログラム署名３１０を、ＲＡＭ１０２に読み込む。また、スキャナ１４１、プリンタ１４２を起動させる起動プログラムを実行する。さらにＮａｔｉｖｅプログラム２１３は、ＣＰＵ１１１の再起動プログラムにしたがって、ＣＰＵ１１１のプログラム起動部をＲＯＭ１１２からＲＡＭ１１３に変更する（すなわちＣＰＵ１１１の起動モードをＲＯＭブートからＲＡＭブートに変更する）。そしてＮａｔｉｖｅプログラム２１３は、この再起動プログラムにしたがって、ＲＡＭ１１３に上述の監視プログラムを書き込んでＣＰＵ１１１を一旦リセットして、ＣＰＵ１１１のリセットを解除する。これによってＣＰＵ１１１は再起動する。この再起動によってＣＰＵ１１１は、Ｓ４０１とは異なり、ＲＡＭブートし、監視プログラムを実行する。
【００８０】
Ｓ５０８においてＪａｖａプログラム改ざん検知処理部２０６は、Ｓ５０５でＲＡＭ１０２に読み込まれた検証用公開鍵３０８を用いて、Ｊａｖａプログラム署名３１０の検証を行い、署名検証に成功したか判定する。署名検証に失敗した場合、Ｓ５１０にてＪａｖａプログラム改ざん検知処理部２０６は操作パネル１４３にエラーメッセージを表示し処理を終了する。署名の検証に成功した場合、Ｊａｖａプログラム改ざん検知処理部２０５は処理を終了し、Ｓ５０９にてＪａｖａプログラム２１４を起動する。
【００８１】
なおＳ５１０の処理は、操作パネル１４３へエラーメッセージを表示するが、これに代えて、Ｓ４１０の処理のように、外部ポート制御部１３７を制御してＬＥＤ１４７を点灯させるようにしてもよい。また操作パネル１４３へのエラーメッセージの表示およびＬＥＤ１４７の点灯の両方が行われてもよい。
【００８２】
以上説明したように実施形態１によれば、ブートプログラムがＢＩＯＳだけでなくリセットベクタの改ざんを検知する処理を実行させることでセキュリティレベルを高めることができる。
【００８３】
また、本実施形態では公開鍵がすべて異なるものであるとして説明したが、同じものがあってもよい。またブートプログラム以外のプログラムの保存場所は限定されるものではなく、別の記憶媒体であってもよい。またプログラムの保存場所が説明した箇所になくてもよく、たとえばフラッシュメモリ１４５やＲＯＭ１１２上にローダー２２３を記憶する構成であってもよい。
【００８４】
（その他の実施形態）
本発明は、上述の実施形態の１以上の機能を実現するプログラムを、ネットワーク又は記憶媒体を介してシステム又は装置に供給し、そのシステム又は装置のコンピュータにおける１つ以上のプロセッサがプログラムを読出し実行する処理でも実現可能である。また、１以上の機能を実現する回路（例えば、ＡＳＩＣ）によっても実現可能である。
【図１】
2020181540.tif 000002
【図２】
2020181540.tif 000003
【図３】
2020181540.tif 000004
【図４】
2020181540.tif 000005
【図５】
2020181540.tif 000006
【図６】
2020181540.tif 000007