(57)【要約】      （修正有）【課題】システム起動時に装置内部で発生するノイズの影響により、不揮発性メモリからローダーにより読み出したプログラムデータにノイズが混入し、プログラムの改ざんと誤判断されることを防止する。【解決手段】情報処理装置のプログラム改ざん検知処理部は、改ざんされたと判断した場合には、不揮発性メモリから、プログラムおよび検証用公開鍵と、プログラム署名を、情報処理装置の内部ＲＡＭに読み込む動作を所定の回数繰り返す。所定回数以上繰り返しても、改ざんされたとの判断が覆らない場合には、情報処理装置の動作を停止する。【選択図】図４
2020091698.tif 000002
【特許請求の範囲】
【請求項１】
プログラムを実行する制御手段と、
前記制御手段が実行するブートプログラムを記憶する記憶手段と、
前記制御手段が前記ブートプログラムを実行する前に、前記記憶手段から前記ブートプログラムを読み出して当該読み出したブートプログラムの正当性を検証し、当該検証において前記ブートプログラムが正当であると確認した場合に前記制御手段を前記記憶手段に記憶された前記ブートプログラムを実行できる状態にする検証手段と、
を有する情報処理装置において、
前記検証手段は、前記検証において前記ブートプログラムの正当性を確認できなかった場合に、前記記憶手段から前記ブートプログラムを再度読み出して正当性を検証し、当該２回目の検証において前記ブートプログラムが正当であると確認した場合に前記制御手段を前記記憶手段に記憶された前記ブートプログラムを実行できる状態にすることを特徴とする情報処理装置。
【請求項２】
前記検証において前記ブートプログラムの正当性を確認できなかった場合とは、前記検証手段が前記ブートプログラムの正当性を検証して当該ブートプログラムが正当でないと確認した場合のことであることを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記制御手段は、前記検証手段によって前記記憶手段に記憶された前記ブートプログラムを実行できる状態にされると、前記記憶手段から前記ブートプログラムを読み出して実行することを特徴とする請求項１または２に記載の情報処理装置。
【請求項４】
前記制御手段をリセット状態にするリセット手段をさらに有し、
前記制御手段は、１回目または２回目の前記検証において前記ブートプログラムが正当であると確認するまで前記リセット手段によってリセット状態のままにされており、
前記検証手段は、１回目または２回目の前記検証において前記ブートプログラムが正当であると確認したら前記制御手段のリセット状態を解除して、前記制御手段を前記記憶手段に記憶された前記ブートプログラムを実行できる状態にすることを特徴とする請求項１乃至３の何れか１項に記載の情報処理装置。
【請求項５】
前記記憶手段は、不揮発性であることを特徴とする請求項１乃至４の何れか１項に記載の情報処理装置。
【請求項６】
前記検証手段は、１回目または２回目の前記検証において前記ブートプログラムの正当性を確認できなかった場合に、前記記憶手段から前記ブートプログラムを再度読み出して正当性を検証し、当該３回目の検証において前記ブートプログラムが正当であると確認した場合に前記制御手段を前記記憶手段に記憶された前記ブートプログラムを実行できる状態にすることを特徴とする請求項１乃至５の何れか１項に情報処理装置。
【請求項７】
前記検証手段は、前記記憶手段からの前記ブートプログラムを再度読み出すまでの時間を設定することを特徴とする請求項１乃至６の何れか１項に記載の情報処理装置。
【請求項８】
前記検証手段は、前記設定された時間が経過してから、前記記憶手段から前記ブートプログラムを再度読み出して、該読み出したブートプログラムの正当性を検証することを特徴とする請求項７に記載の情報処理装置。
【請求項９】
前記検証手段は、前記ブートプログラムの正当性を検証するためのプログラムを実行することで、前記記憶手段から読み出した前記ブートプログラムの正当性を検証することを特徴とする請求項１乃至８の何れか１項に記載の情報処理装置。
【請求項１０】
前記ブートプログラムの正当性の検証は、前記ブートプログラムの内容に基づいて行われることを特徴とする請求項１乃至９の何れか１項に記載の情報処理装置。
【請求項１１】
前記ブートプログラムの正当性の検証は、前記ブートプログラムの内容からハッシュ値を計算して当該計算されたハッシュ値が、当該ブートプログラムに対応する正規のハッシュ値であるかを確認して行われることを特徴とする請求項１０に記載の情報処理装置。
【請求項１２】
通知手段と、
前記検証手段は、最終的に前記ブートプログラムの正当性を確認できなかった場合に前記通知手段の状態を所定の状態に変更することを特徴とする請求項１乃至１１の何れか１項に記載の情報処理装置。
【請求項１３】
前記通知手段は、点灯状態および消灯状態を持つ発光手段であることを特徴とする請求項１２に記載の情報処理装置。
【請求項１４】
原稿の画像を読み取る読取手段と、
画像を印刷する印刷手段と、
を有し、
前記ブートプログラムを実行する前記制御手段は、前記印刷手段を用いた画像の印刷および前記読み取り手段を用いた画像の読み取りを制御することを特徴とする請求項１乃至１３の何れか１項に記載の情報処理装置。
【請求項１５】
プログラムを実行する制御手段と、
前記制御手段が実行するブートプログラムを記憶する記憶手段と、
を有する情報処理装置の制御方法であって、
前記制御手段が前記ブートプログラムを実行する前に、前記記憶手段から前記ブートプログラムを読み出して当該読み出したブートプログラムの正当性を検証する工程と、
前記検証において前記ブートプログラムが正当であると確認した場合に前記制御手段を前記記憶手段に記憶された前記ブートプログラムを実行できる状態にする工程と、
前記検証において前記ブートプログラムの正当性を確認できなかった場合に、前記記憶手段から前記ブートプログラムを再度読み出して正当性を再検証する工程と、
前記再検証において前記ブートプログラムが正当であると確認した場合に前記制御手段を前記記憶手段に記憶された前記ブートプログラムを実行できる状態にする工程と、
を有することを特徴とする情報処理装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置及びその制御方法に関するものである。
【背景技術】
【０００２】
セキュリティ向上を目的としてメモリに記憶されているプログラムの正当性を検証する技術がある。特許文献１は、不揮発性メモリからロードされた揮発性メモリ内の共有ライブラリが改竄されていると判定すると、不揮発性メモリからその共有ライブラリを揮発性メモリに再ロードする技術を開示する。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特許第５７４０５７３号
【発明の概要】
【発明が解決しようとする課題】
【０００４】
情報処理装置が行うブート処理では、装置内の各部で多くの電力を消費する。そのため不揮発性メモリからブートプログラムを読み出すときにブートプログラムにノイズが混入することがある。そのため不揮発性メモリに記憶されているブートプログラムに改竄がなかったとしても、ノイズが混入したブートプログラムの正当性を検証してブートプログラムに改竄があると判定され得る。
【課題を解決するための手段】
【０００５】
本発明の情報処理装置によれば、プログラムを実行する制御手段と、前記制御手段が実行するブートプログラムを記憶する記憶手段と、前記制御手段が前記ブートプログラムを実行する前に、前記記憶手段から前記ブートプログラムを読み出して当該読み出したブートプログラムの正当性を検証し、当該検証において前記ブートプログラムが正当であると確認した場合に前記制御手段を前記記憶手段に記憶された前記ブートプログラムを実行できる状態にする検証手段と、を有する情報処理装置において、前記検証手段は、前記検証において前記ブートプログラムの正当性を確認できなかった場合に、前記記憶手段から前記ブートプログラムを再度読み出して正当性を検証し、当該２回目の検証において前記ブートプログラムが正当であると確認した場合に前記制御手段を前記記憶手段に記憶された前記ブートプログラムを実行できる状態にすることを特徴とする。
【発明の効果】
【０００６】
本発明によれば、ブートプログラムを再度読み出して正当性の検証をおこなうことができる。
【図面の簡単な説明】
【０００７】
【図１】実施例１の複合機のハードウェア構成図
【図２】複合機のソフトウェア構成図
【図３】複合機の起動シーケンスを示す模式図
【図４】実施例１のＣＰＵ１１１の起動シーケンスを示すフローチャート
【図５】実施例１のＣＰＵ１０１の起動シーケンスを示すフローチャート
【図６】実施例２の複合機のハードウェア構成図
【図７】実施例２のＣＰＵ１１１の起動シーケンスを示すフローチャート
【図８】実施例２のＣＰＵ１０１の起動シーケンスを示すフローチャート
【発明を実施するための形態】
【０００８】
以下、添付図面を参照して本発明の実施形態を詳しく説明する。
【０００９】
尚、本発明は、以下の実施形態のみに限定されるものでなく、また本実施形態で説明されている特徴の組み合わせの全てが本発明の解決手段に必須のものとは限らない。
【００１０】
また、実施形態に係る情報処理装置として複合機を例に説明する。しかしながら適用範囲は複合機に限定はせず、情報処理装置であればよい。
【００１１】
（実施例１）
図１は実施例１に係る複合機１０のハードウェア構成を説明するブロック図である。
【００１２】
コントローラ２０は、複合機１０の制御を行うための後述する符号１０１〜１３７で示すハードウェアモジュールで構成される。本実施例では半導体チップとして構成されているものとして説明する。
【００１３】
クロック生成部３０は、クロックを生成して複合機１０内部の各モジュールに適した周波数のクロック信号（外部クロック）を供給する。本実施形態ではクロック生成部３０は、クロック信号３１をコントローラ２０内のＰＬＬ（Ｐｈａｓｅ  Ｌｏｃｋｅｄ  Ｌｏｏｐ）１２３に供給する。なお、周波数はクロック制御信号３２によって変更可能である。
【００１４】
クロック制御部１２１は、ＰＬＬ１２３を内部クロック制御信号３３で制御する。これにより、ＰＬＬ１２３は、クロック信号３１の周波数を逓倍し、周波数が逓倍されたクロック信号をコントローラ２０内部の各モジュール部に対して供給する。
【００１５】
クロック制御部１２１は、コントローラ２０の起動時や動作時に、ＰＬＬ１２３に対して逓倍の設定を変更することで、ＰＬＬ１２３が各モジュール部に最適な周波数のクロック（内部クロック）を供給するように制御を行う。またクロック制御部１２１は、モジュールごとに個別にクロックをゲートして停止させることができる。
【００１６】
リセット生成部４０は、リセット信号４１を生成して複合機１０内部の各モジュールへリセットを掛けたり解除したりする半導体チップである。図１ではコントローラ２０へ供給するリセット信号４１しか図示していないが、スキャナ（読取手段）１４１やプリンタ（印刷手段）１４２などのモジュールにも接続されているものとする。
【００１７】
複合機１０の電源が供給されると一定時間（例えば供給電源電圧が安定するまで）リセット信号４１のリセット状態を保持した後にリセット信号４１を解除状態にしてコントローラ２０のリセットを解除する。リセット信号４１がアサートされている状態がリセット信号４１のリセット状態であり、リセット信号４１がデアサートされている状態がリセット信号４１の解除状態である。
【００１８】
コントローラ２０のリセットが解除されると、リセット制御部１２２は、コントローラ２０内部の各モジュール部に対してリセット制御する。コントローラ２０の起動時や動作時に、各モジュールをリセット状態にしたりリセット解除状態にしたりする制御を行う。
【００１９】
ＣＰＵ１０１は、制御手段であり、複合機１０のソフトウェアプログラムを実行し、装置全体の制御を行う。このＣＰＵ１０１は、後述するようにＢＩＯＳ２１０を始めとした各種プログラムを実行して、プリンタ１４２を用いた画像の印刷およびスキャナ１４１を用いた画像の読み取りを制御する。また、このＣＰＵ１０１は、ＣＰＵ１１１によってＢＩＯＳ２１０の正当性が確認されるまで、リセット制御部１２２によってリセット状態が維持されている。また、後述するように、ＢＩＯＳ２１０の正当性が確認されると、ＣＰＵ１１１がリセット制御部１２２を用いてＣＰＵ１０１のリセット状態を解除する。リセット状態が解除されたＣＰＵ１０１は、フラッシュメモリ１４５に記憶されているＢＩＯＳ２１０を読み出して実行する。
【００２０】
ＲＡＭ１０２は、ＣＰＵ１０１が複合機１０を制御する際に、プログラムや一時的なデータの格納などに使用される揮発性のランダムアクセスメモリである。
【００２１】
ＨＤＤ１４４は、ハードディスクドライブであり、一部のアプリケーション、各種データを格納する。このＨＤＤ１４４は、ＣＰＵ１０１が実行するＪａｖａ（登録商標）プログラム２１４を格納している。なお、Ｊａｖａプログラム２１４については後述する（以下、ＢＩＯＳ２１０などについても同様）。
【００２２】
フラッシュメモリ１４５は、不揮発性の記憶手段であり、複合機１０の固定パラメータ等を格納している。またフラッシュメモリ１４５は、ＣＰＵ１０１が実行するＢＩＯＳ２１０を格納している。このＢＩＯＳ２１０は、ＣＰＵ１０１のブートプログラムであって、リセット状態が解除されたＣＰＵ１０１が初めて実行する外部プログラムである。ここでいう外部プログラムとは、ＣＰＵ１０１の外部の記憶手段（例えばフラッシュメモリ１４５）に記憶されているプログラムのことである。
【００２３】
さらに、ＣＰＵ１０１が実行するローダー２１１、カーネル２１２、Ｎａｔｉｖｅプログラム２１３を格納する。なお、ＨＤＤ１４４とフラッシュメモリ１４５は同一のストレージモジュールであっても良い。
【００２４】
ＣＰＵ１１１は、ＣＰＵ１０１が実行するソフトウェアプログラムの改ざんを検知する改ざん検知ソフトウェアプログラムを実行する他、ＣＰＵ１０１と分担して複合機１０の一部の制御を行う。本実施例のＣＰＵ１１１は、ＣＰＵ１０１がＢＩＯＳ２１０をフラッシュメモリ１４５から読み出して実行する前に、ＢＩＯＳ２１０をフラッシュメモリ１４５から読み出して、読み出したＢＩＯＳ２１０の正当性を検証する検証手段として機能する。プログラムの正当性を検証する方法として、後述の署名検証を本実施例では採用する。ＣＰＵ１１１は、検証によってＢＩＯＳ２１０が正当であると確認した場合に、リセット制御部１２２を用いてＣＰＵ１０１のリセット状態を解除して、ＣＰＵ１０１をフラッシュメモリ１４５に記憶されたＢＩＯＳ２１０を実行できる状態にする。また、ＣＰＵ１１１は、後述するように、検証によってＢＩＯＳ２１０が正当でないと確認した場合に、フラッシュメモリ１４５からＢＩＯＳ２１０を再度読み出して、読み出したＢＩＯＳ２１０の正当性を再検証する。そしてＣＰＵ１１１は、再検証（２回目の検証）によってＢＩＯＳ２１０が正当であると確認した場合に、リセット制御部１２２を用いてＣＰＵ１０１のリセット状態を解除する。これにより、ＣＰＵ１０１は、フラッシュメモリ１４５に記憶されたＢＩＯＳ２１０を実行できる状態になる。
【００２５】
ＲＯＭ１１２は、不揮発性のリードオンリーメモリであり、前記改ざん検知ソフトウェアプログラムや後述の公開鍵などを格納している。またＲＯＭ１１２は、ＣＰＵ１１１が実行するブートプログラム２０９を格納している。
【００２６】
ここで、ＲＯＭ１１２は、外部からのＩ／Ｆから書き換えられないように論理回路で構成されたマスクＲＯＭ、もしくは製造時に一度だけ書き込みが可能なＯＴＰ（Ｏｎｅ  Ｔｉｍｅ  Ｐｒｏｇｒａｍｍａｂｌｅ）ＲＯＭで構成されている。
【００２７】
ＲＡＭ１１３は、揮発性のランダムアクセスメモリであり、ＣＰＵ１１１が複合機１０を制御する際に、プログラムや一時的なデータの格納などに使用される。なおＲＡＭ１０２とＲＡＭ１１３は同一のモジュールで合っても良い。
【００２８】
電源制御部１２０は、コントローラ２０内部の各モジュールに対する電力供給を制御するＩＣ（Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）である。コントローラ２０（複合機１０）の起動時や動作時に、各モジュール部に対して所定の電力を供給したり停止したりすることができる。
【００２９】
スキャナＩ／Ｆ制御部１３１は、スキャナ１４１による原稿の読み取り制御する。プリンタＩ／Ｆ制御部１３２は、プリンタ１４２による印刷処理などを制御する。パネル制御部１３３は、タッチパネル式の操作パネル１４３を制御し、各種情報の表示、使用者からの指示の入力を受け付ける。
【００３０】
ＨＤＤ制御部１３４は、ＨＤＤ１４４に対してデータを読み書きする制御を行う。例えばＲＡＭ１０２に格納されている画像データをシステムバス１０９経由でＨＤＤ１４４に書きだして格納することができる。
【００３１】
フラッシュメモリ制御部１３５は、フラッシュメモリ１４５に対してデータを読み書きする制御を行う。フラッシュメモリ制御部１３５は、フラッシュメモリ１４５に格納されているプログラムを読み出してシステムバス１０９経由でＲＡＭ１１３へ展開する。
【００３２】
ネットワークＩ／Ｆ制御部１３６は、ネットワーク１４６上の他のデバイスやサーバーとのデータの送受信を制御する。
【００３３】
外部ポート制御部１３７は、コントローラ２０の入出力ポート制御部である。例えば出力ポートを制御することによりＬＥＤ１４７を必要に応じて点灯し、ソフトウェアやハードウェアの異常を外部に伝えることができる。ここでＬＥＤ１４７は、ＢＩＯＳ２１０等のプログラムやＣＰＵ１１１等のハードウェアが正常でないことを、点灯状態、消灯状態、および点滅状態（点灯状態と消灯状態の組み合わせ）で通知する通知手段として機能する発光部である。例えば後述するようにＣＰＵ１１１は、最終的に、ＢＩＯＳ２１０の正当性を確認できなかった場合に、ＬＥＤ１４７の状態を所定状態に変更する。
【００３４】
画像処理部１３８は、スキャナ１４１から読み取った画像に画像処理（シェーディング補正）を行ったり、プリンタ１４２で印刷するためにプリンタ１４２に出力される画像に画像処理（ハーフトーン処理やスムージング処理）を行ったりするＡＳＩＣである。
【００３５】
システムバス１０９は、システムバス１０９に接続されている各モジュールを相互に接続する。このシステムバス１０９を介して、ＣＰＵ１０１やＣＰＵ１１１からの制御信号や各装置間のデータ信号が送受信される。
【００３６】
図２は、実施形態１に係る複合機１０が有するソフトウェアモジュールを説明するブロック図である。これらのソフトウェアはＣＰＵ１０１、またはＣＰＵ１１１が実行するものとして説明する。
【００３７】
通信管理部２０７は、ネットワーク１４６に接続されるネットワークＩ／Ｆ制御装置１３６を制御し、ネットワーク１４６を介して外部とデータの送受信を行う。
【００３８】
ＵＩ制御部２０３は、パネル制御部１３３を介して操作パネル１４３への入力を受け取り、入力に応じた処理や操作パネル１４３への画面出力を行う。
【００３９】
ブートプログラム２０９は、複合機１０の電源を入れるとＣＰＵ１１１で実行されるプログラムであり、起動に関わる処理としてコントローラ２０に対して起動シーケンスを実行する。このブートプログラム２０９は、ＢＩＯＳ２１０の改ざん検知を行うＢＩＯＳ改ざん検知処理部２０１を有する。なお、起動シーケンスについては図３及び４を用いて後述する。
【００４０】
ＢＩＯＳ２１０は、ＣＰＵ１１１によるブートプログラム２０９実行後に、ＣＰＵ１０１で実行されるプログラムであり、起動に関わる処理を行うほかにローダー２１１の改ざん検知を行うローダー改ざん検知処理部２０２を有する。
【００４１】
ローダー２１１は、ＢＩＯＳ２１０の処理が終わった後にＣＰＵ１０１で実行されるプログラムであり、起動に関わる処理を行うほかに、カーネルの改ざん検知を行うカーネル改ざん検知処理部２０４を有する。
【００４２】
カーネル２１２は、ローダー２１１の処理が終わった後にＣＰＵ１０１で実行されるプログラムであり、起動に関わる処理を行うほかに、Ｎａｔｉｖｅプログラム２１３の改ざん検知を行うプログラム改ざん検知処理部２０５を有する。
【００４３】
Ｎａｔｉｖｅプログラム２１３は、ＣＰＵ１０１で実行されるプログラムであり、複合機１０のＪａｖａプログラム２１４と連携して各機能を提供する複数のプログラムで構成される。
【００４４】
この複数のプログラムは、例えばスキャナＩＦ制御部１３１やプリンタＩＦ制御部１３２を制御するプログラムや起動プログラムなどを含む。この起動プログラムは、カーネル２１２によってＮａｔｉｖｅプログラム２１３の中から呼び出され、起動処理を行う。
【００４５】
またＮａｔｉｖｅプログラム２１３は、プログラムの中の一つとしてＪａｖａプログラムの改ざん検知を行うＪａｖａプログラム改ざん検知処理部２０６を有する。
【００４６】
Ｊａｖａプログラム２１４は、ＣＰＵ１０１で実行されるプログラムであり、複合機１０のＮａｔｉｖｅプログラム２１３と連携して各機能を提供するプログラム（例えば、操作パネル１４３に画面を表示するプログラムなど）である。
【００４７】
次に、複写機１０の起動シーケンスについて図３を用いて説明する。
【００４８】
図３（ａ）は、改ざん検知を行わずに複合機１０が起動する順序を示す起動シーケンス模式図である。ブートプログラム２０９がＢＩＯＳ２１０を起動し、ＢＩＯＳ２１０がローダー２１１を起動し、ローダー２１１がカーネル２１２を起動し、カーネル２１２がＮａｔｉｖｅプログラム２１３の中から起動プログラムを起動する。
【００４９】
起動プログラムの中でＪａｖａプログラム２１４が起動され、以降はＮａｔｉｖｅプログラム２１３とＪａｖａプログラム２１４が連携して複合機１０の有する各機能を提供する。
【００５０】
図３（ｂ）は、ブートプログラム２０９からＢＩＯＳ２１０、ローダー２１１、カーネル２１２、Ｎａｔｉｖｅプログラム２１３、Ｊａｖａプログラム２１４が、それぞれ改ざん検知を行う処理の流れを表した起動シーケンスの模式図である。なお図中、各プログラムの保存場所、デジタル署名（以下、「署名」という）と公開鍵の保存場所をも表している。
【００５１】
ここで、署名とは、例えば正規のプログラム（データ列、内容）を所定のハッシュ関数によってハッシュ値（メッセージ・ダイジェスト）に変換し、公開鍵に対応する秘密鍵でハッシュ値を暗号化したものである。この暗号化されたハッシュ値を公開鍵で復号することで正規のプログラムのハッシュ値（正規のハッシュ値）を得て、改ざんの有無の検証対象であるプログラムを前述のハッシュ関数によってハッシュ値に変換（計算）し、これら２つのハッシュ値を比較する。
【００５２】
２つのハッシュ値が等しければ検証対象のプログラムは正規のプログラムから改ざんされていないと判定できる。すなわちプログラムが正当であると確認できる。また、もし２つのハッシュ値が異なれば検証対象のプログラムは正規のプログラムから改ざんされていると判定できる。すなわちプログラムが正当でないと確認できる。
【００５３】
このように署名を用いて検証対象のプログラムの改ざん有無を調べる方法を、以降では、「署名検証」と呼ぶ。また、プログラムが改ざんされていない（検証対象のプログラムが正規のものである）ことを、署名検証に成功すると呼び、プログラムが改ざんされている（検証対象のプログラムが正規のものでない）ことを、署名検証に失敗すると呼ぶ。
【００５４】
本実施例では、プログラムの改ざん有無を判断する方法として、このような署名および公開鍵を用いる方法を採るが、改ざんの有無を判断する他の方法でも良い。
【００５５】
ＲＯＭ１１２には、ブートプログラム２０９の他にＢＩＯＳ署名検証用の公開鍵３００が含まれる。
【００５６】
フラッシュメモリ１４５には、ＢＩＯＳ２１０、ローダー２１１、カーネル２１２、Ｎａｔｉｖｅプログラム２１３、Ｊａｖａプログラム２１４の他に、次のものも含まれている。暗号化されたＢＩＯＳ署名３０２、ローダー検証用公開鍵３０３、暗号化されたローダー署名３０４、カーネル検証用公開鍵３０５、暗号化されたカーネル署名３０６、Ｎａｔｉｖｅプログラム検証用公開鍵３０７である。
【００５７】
また、暗号化されたＮａｔｉｖｅプログラム署名３０８、Ｊａｖａプログラム検証用公開鍵３０９、暗号化されたＪａｖａプログラム署名３１０もフラッシュメモリ１４５に含まれている。これらの公開鍵と署名は、予め複合機１０を製造する段階でプログラムに対して付与されたものとする。
【００５８】
改ざん検知処理部２０１、２０２、２０４、２０５、２０６が次のプログラムが改ざんされているかどうかを検証し、改ざんされていなければ次のプログラムを起動する。このようにプログラムの改ざん検知およびプログラムの起動を順次行う起動シーケンスに従い複合機１０は起動する。
【００５９】
続いて、本発明に係る起動シーケンスにおいて改ざん検知プログラムを実施する方法について図４、図５を用いて説明をする。
【００６０】
図４はＣＰＵ１１１が実行する起動シーケンスの処理のフローチャートであり、図５はＣＰＵ１０１が実行する起動シーケンスの処理のフローチャートである。
【００６１】
なお、本実施例では初期状態においては次の設定で動作してから図４のフローチャートの処理が実行されるものとする。
【００６２】
複合機１０の電源が入ると電源制御部１２０は、コントローラ２０の各部に電力を供給するように制御を行う。またクロック制御部１２１は、電力が供給されると、クロック制御信号３２をクロック生成部３０に出力することで、クロック生成部３０の発振器もしくは振動子にクロック信号３１を生成させるように制御する。
【００６３】
次にリセット生成部４０は、リセット信号４１を介してリセット制御部１２２に対するリセットを解除する。リセット制御部１２２に対するリセットが解除されると、まずリセット制御部１２２は、ＰＬＬ１２３、電源制御部１２０、クロック制御部１２１、システムバス１０９のリセットを解除する。さらにリセット制御部１２２は、ＣＰＵ１１１、ＲＯＭ１１２、フラッシュメモリ制御部１３５、外部ポート制御部１３７のリセットも解除する。フラッシュメモリ１４５は、ＣＰＵ１１１により外部ポート制御部１３７を操作することにより、リセットが解除される。
【００６４】
このときはまだ、ＣＰＵ１０１はリセット状態のままである。またＣＰＵ１１１のリセットベクターは、ＲＯＭ１１２のアドレスである。すなわち、ＣＰＵ１１１のリセットが解除されるとＣＰＵ１１１は、リセットベクターが示すＲＯＭ１１２のアドレスに記憶されているプログラムを実行する。
【００６５】
なお、ＣＰＵ１０１のリセットベクターは、フラッシュメモリ１４５のアドレスであり、ＣＰＵ１０１のリセットが解除されると、ＣＰＵ１０１は、リセットベクターが示すフラッシュメモリ１４５のアドレスに記憶されているプログラムを実行する。
【００６６】
以下にＳ４０１〜Ｓ４１１はＣＰＵ１１１が実行する起動シーケンスを図４に沿って説明する。すなわちＣＰＵ１１１が実行する図２に示されるソフトウェアモジュールによって以下の処理が行われる。
【００６７】
Ｓ４０１において、ＣＰＵ１１１のリセットが解除されると、ＣＰＵ１１１は、リセットベクターにしたがって、始めにＲＯＭ１１２に書かれているブートプログラムを実行する。このブートプログラムには、後述のＳ４１０の処理で用いられる内部変数Ｒｅｔｒｙ＿ｎｕｍと閾値Ｍａｘ＿ｎｕｍが含まれ、Ｓ４０１においてＣＰＵ１１１は、内部変数Ｒｅｔｒｙ＿ｎｕｍを「０（ゼロ）」に初期化する。このＲｅｔｒｙ＿ｎｕｍは、署名検証のリトライ回数を示し、Ｍａｘ＿ｎｕｍはリトライ回数の上限回数を示す。閾値Ｍａｘ＿ｎｕｍは例えば「２」である。すなわち、署名検証は本実施例では最大で３回行われる。後述するように、１回目の検証においてブートプログラムの正当性が確認できなかった場合に２回目の検証が行われ、２回目の検証においてもブートプログラムの正当性が確認できなかった場合に３回目の検証が行われる。３回の検証を行っても最終的にブートプログラムの正当性が確認できなかった場合に、ＬＥＤ１４７を点灯あるいは点滅状態にしてブートプログラムが正当でないことを通知する。
【００６８】
Ｓ４０２において、ＣＰＵ１１１は、ブートプログラムに従って電源制御を行う。本実施例では、改ざん検知を行うために必要なコントローラ２０内の一部のモジュールのみに電源を供給するように制御を行う。
【００６９】
なお、改ざん検知処理時に必要なモジュールは、クロック制御部１２１、リセット制御部１２２、ＰＬＬ１２３、電源制御部１２０、ＣＰＵ１０１、フラッシュメモリ１４５、ＲＡＭ１０２である。また、ＣＰＵ１１１、ＲＯＭ１１２、ＲＡＭ１１３、ＨＤＤ制御部１３４、フラッシュメモリ制御部１３５、外部ポート制御部１３７である。
【００７０】
Ｓ４０３において、ＣＰＵ１１１は、ブートプログラムに従って以下のクロック制御を行う。なお、コントローラ２０内の各モジュールの動作周波数は複合機１０の製品仕様に応じて異なる。
【００７１】
クロック制御部１２１は、クロック制御信号３２によってクロック生成部３０に対して、クロック信号３１を供給するように指示する。またクロック制御部１２１は、内部クロック制御信号３３によってＰＬＬ１２３に対して、コントローラ２０内の必要なモジュールに対して供給される内部クロックの周波数を設定する。この設定に応じた周波数で、ＣＰＵ１１１やシステムバス１０９、フラッシュメモリ制御部１３５は処理を行うことができる。
【００７２】
また、クロック制御部１２１は、ＣＰＵ１０１、フラッシュメモリ１４５、ＲＡＭ１０２、ＣＰＵ１１１、ＲＯＭ１１２、ＲＡＭ１１３、システムバス１０９、ＨＤＤ制御部１３４、フラッシュメモリ制御部１３５に供給されるクロックの設定を行う。
【００７３】
ただし、図４に示すフローにおいて、クロックの供給が必要ないブロック、例えば、スキャナＩＦ制御部１３１やプリンタＩＦ制御部１３２などには、クロックの供給は本ステップの段階では行なわず、必要となった段階までクロックゲートしておくこともできる。
【００７４】
なお、供給されるクロックの周波数は、供給先のモジュールによって異ならせてよい。例えばＣＰＵ１１１には１５０ＭＨｚ、システムバス１０９には６００ＭＨｚのクロックをそれぞれ供給してよい。
【００７５】
Ｓ４０４において、ＣＰＵ１１１は、ブートプログラムに従ってリセット解除を行う。すなわちＣＰＵ１１１は、改ざん検知処理に必要なモジュールのリセットを解除する。具体的には、ＣＰＵ１１１は、システムバス１０９、フラッシュメモリ制御部１３５のリセットを解除する。
【００７６】
Ｓ４０５において、ＣＰＵ１１１は、ブートプログラム２０９に従ってＢＩＯＳ２１０の署名検証を行う。ブートプログラム２０９に含まれるＢＩＯＳ改ざん検知処理部２０１は、フラッシュメモリ１４５から、システムバス１０９を介してＢＩＯＳ２１０、ＢＩＯＳ署名３０２を、ＲＡＭ１１３に読み込む。次に、ＢＩＯＳ改ざん検知処理部２０１は、ＢＩＯＳ検証用公開鍵３００を用いてＢＩＯＳ署名３０２の検証を行う。すなわち、ＢＩＯＳ改ざん検知処理部２０１は、フラッシュメモリ１４５から読み込んだＢＩＯＳ２１０のハッシュ値を計算し、かつ、読み込まれたＢＩＯＳ署名３０２に対してＢＩＯＳ検証用公開鍵３０１を適用して復号する。
【００７７】
そしてＢＩＯＳ改ざん検知処理部２０１は、計算されたハッシュ値と、ＢＩＯＳ署名３０２を復号して得られた値とを比較し、双方の値が一致するか判定する。
【００７８】
双方の値が一致していれば、ＢＩＯＳ２１０の署名検証に成功したと判定される。そうでなければ、ＢＩＯＳ２１０の署名検証に失敗したと判定される。
【００７９】
Ｓ４０６において、ＣＰＵ１１１は、ＢＩＯＳ２１０の署名検証が成功したかを判定する。署名検証の結果、署名検証に成功した（ハッシュ値と署名の値とが一致した）ならば、ＢＩＯＳ２１０が改ざんされていないとして、処理はＳ４０７に進む。
【００８０】
なお、本ステップＳ４０６において、署名検証に成功した場合、内部変数Ｒｅｔｒｙ＿ｎｕｍを「０（ゼロ）」に初期化する。
【００８１】
一方で、署名検証に失敗した（ハッシュ値と署名の値とが一致しなかった）ならば、ＢＩＯＳ２１０が改ざんされているかもしれないとして、処理はＳ４１０に進む。
【００８２】
Ｓ４０７において、ＣＰＵ１１１は、クロック制御部１２１を制御して、ＰＬＬ１２３が供給するクロックの周波数の変更、クロックを供給するモジュールの変更等を行う。
【００８３】
例えば、ＣＰＵ１１１に供給するクロック周波数、システムバス１０９に供給するクロック周波数がそれぞれ１００ＭＨｚ、４００ＭＨｚに設定される。またＣＰＵ１０１にクロックが供給されるように設定される。
【００８４】
なお、本ステップでのクロック制御は、後述する図５においてＣＰＵ１０１が実行するプログラムのＢＩＯＳ２１０やカーネル２１２で実行しても良い。
【００８５】
Ｓ４０８において、ＣＰＵ１１１は、電源制御部１２０を制御して、コントローラ２０内の全モジュールに電源を供給するように制御を行う。
【００８６】
Ｓ４０９において、ＣＰＵ１１１は、リセット制御部１２２を制御してＣＰＵ１０１、ＨＤＤ制御部１３４、パネル制御部１３３のリセットを解除し、ブートプログラムの処理を終了する。
【００８７】
そして、起動シーケンスは、後述するＳ５０１へ遷移する。すなわちＣＰＵ１０１がＢＩＯＳ２１０を実行してＢＩＯＳ２１０が起動することになる。
【００８８】
Ｓ４１０では、ＣＰＵ１１１は、内部変数Ｒｅｔｒｙ＿ｎｕｍと閾値Ｍａｘ＿ｎｕｍを用いて、ＢＩＯＳ２１０の署名検証のリトライ回数がＭａｘ＿ｎｕｍ回（例えば２回）に達したかを判断する。ここではＣＰＵ１１１は、Ｒｅｔｒｙ＿ｎｕｍがＭａｘ＿ｎｕｍ以上であるか否かを判定する。
【００８９】
Ｒｅｔｒｙ＿ｎｕｍ＜Ｍａｘ＿ｎｕｍの場合、つまり、署名検証のリトライ回数が閾値Ｍａｘ＿ｎｕｍ未満の場合は、ステップＳ４１１の処理が行われる。一方で、Ｒｅｔｒｙ＿ｎｕｍ≧Ｍａｘ＿ｎｕｍの場合、つまり、署名検証のリトライ回数が閾値Ｍａｘ＿ｎｕｍ以上の場合は、ステップＳ４１２の処理が行われる。これは、ＢＩＯＳ２１０の正当性を最終的に確認できなかった場合に、ステップＳ４１２の処理が行われることに他ならない。
【００９０】
Ｓ４１１において、ＣＰＵ１１１は、所定時間だけＢＩＯＳ２１０の署名検証のリトライ開始を待機する。所定時間だけ待機すればフラッシュメモリ１４５からのＢＩＯＳ２１０および署名３０２の読み込みにおける電源ノイズ等のノイズの影響が小さくなる。その結果、ＢＩＯＳ２１０の署名検証に失敗した原因がノイズであれば、署名検証を再実施することで成功する可能性が高まる。そのため、所定時間だけ待機してから署名検証をリトライする構成を採っている。すなわちＣＰＵ１１１は、フラッシュメモリ１４５からＢＩＯＳ２１０を再度読み出すまでの時間（所定時間）を設定し、この設定時間が経過してから、フラッシュメモリ１４５からＢＩＯＳ２１０を再度読み出して読み出したＢＩＯＳ２１０の正当性を検証する。なお、本ステップＳ４１１において、所定時間の待機を行わずに、即座にＳ４０５へ遷移することも可能である。
【００９１】
所定時間の待機後の署名検証のリトライにおいてＣＰＵ１１１は、Ｓ４０５と同様に、ＢＩＯＳ２１０および署名３０２をフラッシュメモリ１４５からＲＡＭ１１３に再読み込みしてハッシュ値計算および署名の復号を行う。
【００９２】
ステップＳ４１２においてＣＰＵ１１１は、署名検証に失敗したことを外部へ通知するために、外部ポート制御部１３７を制御してＬＥＤ１４７を点灯させ、ブートプログラムの起動処理を終了する。なおＬＥＤ１４７を点灯するのではなく、点滅するようにしてもよい。
【００９３】
以上のシーケンスを実行することで、ＣＰＵ１０１は改ざんされていないＢＩＯＳ２１０を実行することが可能となる。
【００９４】
以下にＳ５０１〜Ｓ５１８はＣＰＵ１０１が実行する起動シーケンスを図５に沿って説明する。すなわちＣＰＵ１０１が実行する図２に示されるソフトウェアモジュールによって以下の処理が行われる。
【００９５】
なお、下記で説明する処理でのプログラム（ローダー２１１、カーネル２１２、Ｎａｔｉｖｅプログラム２１３、Ｊａｖａプログラム２１４）の改ざん検知の有無の判定方法は一例であり、プログラムの改ざんを検知する方法であれば他の方法が実行されてもよい。
【００９６】
Ｓ５０１において、ＣＰＵ１０１は、フラッシュメモリ１４５からシステムバス１０９を介してＢＩＯＳ２１０をＲＡＭ１０２に読み込んで実行し、各種初期化処理を行う。ここでの初期化は、例えばＨＤＤ制御部１３４の初期化を行い、ＨＤＤ１４４へアクセスができるようにする。
【００９７】
本ステップにおいて、ＢＩＯＳ２１０に含まれるローダー改ざん検知処理部２０２は、フラッシュメモリ１４５から、ローダー２１１、ローダー検証用公開鍵３０３、ローダー署名３０４を、ＲＡＭ１０２に読み込む。
【００９８】
Ｓ５０２において、ローダー改ざん検知処理部２０２は、ローダー検証用公開鍵３０３を用いてローダー署名３０４の検証を行い、署名検証に成功したか判定する。署名検証に成功した場合、ローダー改ざん検知処理部２０４は処理を終了し、ＢＩＯＳ２１０が、ＲＡＭ１０２に読み込まれたローダー２１１を起動する。なお、本ステップＳ５０２において、署名検証に成功した場合、内部変数Ｒｅｔｒｙ＿ｎｕｍを「０（ゼロ）」に初期化する。
【００９９】
一方で、署名検証に失敗した場合、Ｓ５１０にてローダー改ざん検知処理部２０２は、内部変数Ｒｅｔｒｙ＿ｎｕｍと判断閾値Ｍａｘ＿ｎｕｍを用いて、署名検証のリトライ回数が上限Ｍａｘ＿ｎｕｍに達したかを判断する。
【０１００】
Ｒｅｔｒｙ＿ｎｕｍ＜Ｍａｘ＿ｎｕｍの場合、つまり、署名検証のリトライ回数が閾値Ｍａｘ＿ｎｕｍ未満の場合は、ステップＳ５１１へと遷移する。一方で、Ｒｅｔｒｙ＿ｎｕｍ≧Ｍａｘ＿ｎｕｍの場合、つまり、署名検証のリトライ回数が閾値Ｍａｘ＿ｎｕｍ以上の場合は、ステップＳ５１８へと遷移する。そして、ローダー改ざん検知処理部２０２は、署名検証に失敗したことを外部へ通知するために、パネル制御部１３３の初期化を行い、操作パネル１４３にエラーメッセージを表示し処理を終了する。
【０１０１】
Ｓ５１１においては、ローダー改ざん検知処理部２０２は、署名検証のリトライ開始まで所定時間待機する。本ステップにおける処理は、図４のステップＳ４１１における処理と同じであるため、説明は省略する（以下、ステップＳ５１３、ステップＳ５１５、ステップＳ５１７も同様である）。
【０１０２】
Ｓ５０３において、ローダー２１１は、起動されると、各種初期化処理を行う。ここでの初期化は、例えばパネル制御部１３３の初期化を行って操作パネル１４３に起動画面を表示させたりする。
【０１０３】
また、ローダー２１１に含まれるカーネル改ざん検知処理部２０４が、フラッシュメモリ１４５から、カーネル２１２、カーネル検証用公開鍵３０５とカーネル署名３０６を、ＲＡＭ１０２に読み込む。
【０１０４】
Ｓ５０４において、カーネル改ざん検知処理２０４は、カーネル検証用公開鍵３０５を用いてカーネル署名３０６の検証を行い、署名検証に成功したか判定する。
【０１０５】
署名検証に成功した場合、カーネル改ざん検知処理部２０４は処理を終了し、ローダー２１１がＲＡＭ１０２に読み込まれたカーネル２１２を起動する。
【０１０６】
なお、本ステップＳ５０４において、署名検証に成功した場合、内部変数Ｒｅｔｒｙ＿ｎｕｍを「０（ゼロ）」に初期化する。
【０１０７】
一方で、署名検証に失敗した場合、Ｓ５１２にてカーネル改ざん検知処理部２０４は、ステップＳ５１０と同様に、署名検証に何回失敗したかを判断する。
【０１０８】
署名検証の再実施回数が判断閾値以下の場合は、ステップＳ５１３へと遷移し、署名検証の再実施開始まで所定時間待機を行う。一方で、署名検証の再実施回数が判断閾値を超えた場合は、ステップＳ５１８へと遷移し、署名検証に失敗したことを外部へ通知するために、操作パネル１４３にエラーメッセージを表示し処理を終了する。
【０１０９】
Ｓ５０５において、カーネル２１２は起動されると、各種初期化処理を行う。ここでの初期化は、例えばネットワークＩ／Ｆ制御部１３６の初期化を行ってネットワーク１４６との通信が行えるようにする。
【０１１０】
次にカーネル２１２に含まれるプログラム改ざん検知処理部２０５が、フラッシュメモリ１４５から、Ｎａｔｉｖｅプログラム２１３およびＮａｔｉｖｅプログラム検証用公開鍵３０７と、Ｎａｔｉｖｅプログラム署名３０８を、ＲＡＭ１０２に読み込む。
【０１１１】
Ｓ５０６において、プログラム改ざん検知処理部２０５は、検証用公開鍵３０７を用いて、Ｎａｔｉｖｅプログラム署名３０８の検証を行い、署名検証に成功したか判定する。
【０１１２】
署名検証に成功した場合、プログラム改ざん検知処理部２０５は処理を終了し、Ｎａｔｉｖｅプログラム２１３を起動する。一方で、署名検証に失敗した場合、ステップＳ５１０と同様に、署名検証に何回失敗したかを判断する。
【０１１３】
署名検証の再実施回数が判断閾値以下の場合は、ステップＳ５１５へと遷移し、署名検証の再実施開始まで所定時間の待機を行う。
【０１１４】
なお、本ステップＳ５０６において、署名検証に成功した場合、内部変数Ｒｅｔｒｙ＿ｎｕｍを「０（ゼロ）」に初期化する。
【０１１５】
一方で、署名検証の再実施回数が判断閾値を超えた場合は、ステップＳ５１８へと遷移し、署名検証に失敗したことを外部へ通知するために、操作パネル１４３にエラーメッセージを表示し処理を終了する。
【０１１６】
Ｓ５０７において、Ｎａｔｉｖｅプログラム２１３のうち、改ざん検知の処理を行うＪａｖａプログラム改ざん検知処理部２０６が起動されると、次の処理が行われる。すなわちＪａｖａプログラム改ざん検知処理部２０６は、フラッシュメモリ１４５からＪａｖａプログラム検証用公開鍵３０９と、ＨＤＤ１４４からＪａｖａプログラム２１４とＪａｖａプログラム署名３１０を、ＲＡＭ１０２に読み込む。
【０１１７】
Ｓ５０８において、Ｊａｖａプログラム改ざん検知処理部２０６は、検証用公開鍵３０９を用いて、Ｊａｖａプログラム署名３１０の検証を行い、署名検証に成功したか判定する。
【０１１８】
署名の検証に成功した場合、Ｊａｖａプログラム改ざん検知処理部２０５は処理を終了し、Ｓ５０９にてＪａｖａプログラム２１４を起動する。
【０１１９】
なお、本ステップＳ５０８において、署名検証に成功した場合、内部変数Ｒｅｔｒｙ＿ｎｕｍを「０（ゼロ）」に初期化する。
【０１２０】
一方で、署名検証に失敗した場合、ステップＳ５１０と同様に、署名検証に何回失敗したかを判断する。
【０１２１】
署名検証の再実施回数が判断閾値以下の場合は、ステップＳ５１７へと遷移し、署名検証の再実施開始まで所定時間の待機を行う。一方で、署名検証の再実施回数が判断閾値を超えた場合は、ステップＳ５１８へと遷移し、署名検証に失敗したことを外部へ通知するために、操作パネル１４３にエラーメッセージを表示し処理を終了する。
【０１２２】
なお、Ｓ５１８の処理は、操作パネル１４３へエラーメッセージを表示するが、これに代えて、Ｓ４１２の処理のように、外部ポート制御部１３７を制御してＬＥＤ１４７を点灯させるようにしてもよい。また操作パネル１４３へのエラーメッセージの表示およびＬＥＤ１４７の点灯の両方が行われてもよい。
【０１２３】
以上説明したように実施形態１によれば、プログラム改ざん検知処理部が、改ざんされたと判断した場合には、不揮発性メモリから、プログラムおよび検証用公開鍵と、プログラム署名を、情報処理装置の内部ＲＡＭに読み込む動作を所定の回数繰り返す。これによって、システム起動時に装置内部で発生するノイズの影響により、不揮発性メモリからローダーにより読み出したプログラムデータにノイズが混入し、プログラムの改ざんと誤判断される不具合を緩和することができる。
【０１２４】
なお、各ステップにおいて、不揮発性メモリからプログラム等を内部ＲＡＭに読み込む動作を所定回数以上繰り返しても、改ざんされたとの判断が覆らない場合には、ノイズの影響ではなく、プログラムが改ざんされたものと判断し、複合機の起動動作を停止する。
【０１２５】
（実施例２）
実施例２について説明する。実施例１は、起動時の各ステップにおけるプログラム改ざん検知処理部の動作に注目して揮発性メモリからプログラム等を内部ＲＡＭに読み込む動作を繰り返す構成を採った。これに対して本実施例２では、起動時フロー全体に注目して、起動フロー自体を繰り返す構成で採る方法について説明する。
【０１２６】
なお、実施例１の説明と重複する箇所も多いため、実施例１との差分を中心に説明する。
【０１２７】
図６は本実施例の複合機１０の構成図である。実施例１との差分は、外部ポート制御部１３７からリセット生成部４０に対して、リセット要求信号４２を出力する構成を持つ点である。
【０１２８】
このリセット要求信号４２は、ＣＰＵ１０１あるいはＣＰＵ１１１により、外部ポート制御部１３７を制御することで生成される。外部ポート制御部１３７からリセット生成部４０に対して、リセット要求信号４２がアサートされることで、リセット生成部４０は、コントローラ２０に対して、リセット信号４１をアサートする。
【０１２９】
このリセット信号４１がアサートされることで、コントローラ２０のリセットがされ、リセット制御部１２２はコントローラ２０内部の各モジュール部に対してリセットをアサートする。つまり、コントローラ２０の起動時と同様に、各モジュールをリセット状態にする。
【０１３０】
このリセット状態にする対象モジュールには、外部ポート制御部１３７も含まれており、リセットがアサートされることで、外部ポートは全体的に出力状態から入力状態へと強制的に遷移する。
【０１３１】
外部ポート全体の状態遷移により、リセット要求信号４２はリセットをアサートする論理（例えば、Ｌｏｗ）からデアサートする論理（アサートの反対論理。本例では、Ｈｉｇｈ）へと遷移する。
【０１３２】
リセット要求信号４２がデアサートされると、リセット生成部４０が生成されるリセット信号４１もデアサートされ、リセット制御部１２２により、コントローラ２０内部の各モジュールに対するリセット解除がされる。
【０１３３】
図７は、実施例２における本発明に係るＣＰＵ１１１の起動シーケンスである。
【０１３４】
なお、下記で説明する処理において図４及び図５を用いて説明した前述の処理フローについては、説明の重複を避けるため、同一処理には同一の表記（Ｓ４０１〜Ｓ４０９、Ｓ４１２）を行い、差分となる部分を中心に説明を行う。
【０１３５】
図７において、Ｓ４０１からＳ４０９までの処理フロー及びＳ４１２の処理フローは前述の通りである。
【０１３６】
Ｓ７０１では、Ｓ４０６におけるＢＩＯＳ署名検証の検証に失敗した場合に、ＣＰＵ１１１は、内部変数Ｒｅｂｏｏｔ＿ｎｕｍと判断閾値Ｍａｘ＿ｎｕｍにより、署名検証に何回失敗したかを判断する。
【０１３７】
Ｒｅｂｏｏｔ＿ｎｕｍ＜Ｍａｘ＿ｎｕｍの場合、つまり、起動シーケンスのリブート回数が判断閾値未満の場合は、ステップＳ７０２へと遷移する。一方で、Ｒｅｂｏｏｔ＿ｎｕｍ≧Ｍａｘ＿ｎｕｍの場合、つまり、起動シーケンスのリブート回数が判断閾値以上の場合は、ステップＳ４１２へと遷移する。そして、署名検証に失敗したことを外部へ通知するために、外部ポート制御部１３７を制御してＬＥＤ１４７を点灯させ、ブートプログラムの起動処理を終了する。
【０１３８】
Ｓ７０２においては、起動シーケンスのリブート開始まで所定時間の待機を行う。これは、Ｓ４１１等での所定時間の待機と同様に、署名検証が失敗した原因と考えられるノイズの影響が、時間の経過とともに収束方向に向かう可能性があるため、待ち時間を設けている。
【０１３９】
なお、本ステップＳ７０２において、所定時間の待機を行わずに、即座にＳ４０１へ遷移することも可能である。
【０１４０】
Ｓ７０２で所定時間の待機後に、起動シーケンスのリブートを開始する。つまり、ＣＰＵ１１１の起動シーケンスをＳ４０１のブートプログラムの起動からやり直す。
【０１４１】
なお、起動シーケンスのリブート回数を示す内部変数Ｒｅｂｏｏｔ＿ｎｕｍは、リセットの有無に関わらず不揮発な領域、例えば、フラッシュメモリ１４５に格納される。
【０１４２】
そして、起動シーケンス開始時に読み出され、内部変数Ｒｅｂｏｏｔ＿ｎｕｍにセットされる。図７及び図８に記載の起動シーケンスが全て成功した場合、あるいは、判断閾値Ｍａｘ＿ｎｕｍを超えて起動処理を終了する段階で０クリアされる。不揮発な領域に格納されたＲｅｂｏｏｔ＿ｎｕｍも同様に扱われる。
【０１４３】
起動処理終了時に不揮発な領域に格納されたＲｅｂｏｏｔ＿ｎｕｍを０クリアするのは、次の理由からである。すなわち、装置の電源をＯＦＦ／ＯＮされて再起動された場合に、不揮発領域に残ったＲｅｂｏｏｔ＿ｎｕｍが判断閾値Ｍａｘ＿ｎｕｍを超えていると、リブート処理が１度も実施されることがないためである。
【０１４４】
Ｓ４０６において、ＣＰＵ１１１は、ＢＩＯＳの署名検証が成功したかを判定し、署名検証に成功した以降の処理は、図４及び上記で説明したフローと同じであるため、ここでは省略する。
【０１４５】
図８は、実施例２における本発明に係るＣＰＵ１０１の起動シーケンスである。
【０１４６】
図７のＣＰＵ１１１の起動シーケンスと同様に、検証失敗時にリブートを行うステップ、リブート開始までの所定時間の待機というステップが各フローにおいて追加されている。
【０１４７】
すなわち、Ｓ５０２のローダー署名検証の判断で失敗した場合に、Ｓ８０１においてリブート回数が閾値を超えているかの判断が行われる。そして、Ｓ５０４のカーネル署名検証の判断で失敗した場合に、Ｓ８０３においてリブート回数が閾値を超えているかの判断が行われる。そして、Ｓ５０６のＮａｔｉｖｅプログラム署名検証の判断で失敗した場合に、Ｓ８０４においてリブート回数が閾値を超えているかの判断が行われる。そして、Ｓ５０８のＪａｖａプログラム署名検証の判断で失敗した場合に、Ｓ８０５においてリブート回数が閾値を超えているかの判断が行われる。
【０１４８】
Ｓ８０１、Ｓ８０３、Ｓ８０４、Ｓ８０５のいずれのリブート回数が閾値を超えているかの判断のフローにおいて、Ｒｅｂｏｏｔ＿ｎｕｍ＜Ｍａｘ＿ｎｕｍの場合、つまり、起動シーケンスのリブート回数が判断閾値未満の場合は、ステップＳ８０２へと遷移する。
【０１４９】
Ｓ８０２においては、起動シーケンスのリブート開始まで所定時間の待機を行う。これは、Ｓ４１１等での所定時間の待機と同様に、署名検証が失敗した原因と考えられるノイズの影響が、時間の経過とともに収束方向に向かう可能性があるため、待ち時間を設けている。
【０１５０】
Ｓ８０２における所定時間の待機後には、コントローラ２０全体へのリセットが実行されることになるため、図７で示したＣＰＵ１１１の起動シーケンスから再度行うこととなる。
【０１５１】
なお、本ステップＳ８０２において、所定時間の待機を行わずに、即座にＣＰＵ１１１の起動シーケンスを開始するフローと遷移することも可能である。
【０１５２】
一方で、Ｒｅｂｏｏｔ＿ｎｕｍ≧Ｍａｘ＿ｎｕｍの場合、つまり、リブート回数が閾値以上の場合は、ステップＳ５１８へと遷移し、署名検証に失敗したことを外部へ通知するために、操作パネル１４３にエラーメッセージを表示し処理を終了する。
【０１５３】
以上説明したように実施形態２によれば、プログラム改ざん検知処理部が、改ざんされたと判断した場合には、起動シーケンスを最初から所定の回数繰り返す。このことによって、システム起動時に装置内部で発生するノイズの影響により、不揮発性メモリからローダーにより読み出したプログラムデータにノイズが混入し、プログラムの改ざんと誤判断される不具合を緩和することができる。
【０１５４】
なお、各ステップにおいて、起動シーケンスを最初から所定回数以上繰り返しても、改ざんされたとの判断が覆らない場合には、ノイズの影響ではなく、プログラムが改ざんされたものと判断し、複合機の起動動作を停止する。
【０１５５】
さらに、Ｓ８０２における所定時間の待機後には、コントローラ２０全体へのリセットを実行するのではなく、図１で示すリセット制御部１２２に対してリセット要求信号４２を出力し、ＣＰＵ１１１の起動シーケンスを再度やり直すこともできる。
【０１５６】
（実施例３）
プログラム改ざん検知処理部が、改ざんされたと判断した場合には、次の２つのフローを組み合わせて実施してもよい。１つめのフローは、不揮発性メモリから、プログラムおよび検証用公開鍵とプログラム署名を情報処理装置の内部ＲＡＭに読み込む動作を所定の回数繰り返すフローである。２つ目のフローは、起動シーケンスを最初から所定の回数繰り返すフローである。
【０１５７】
例えば、図７に記載のＣＰＵ１１１に関する起動シーケンス部分と、図５に記載のＣＰＵ１０１に関する起動シーケンスを組み合わせて実施することもできる。
【０１５８】
起動シーケンス初期段階では、起動直後の突入電流によるノイズ発生の影響を受けやすい。そのため、この組み合わせフローにおいて、スキャナ１４１やプリンタ１４２の起動は継続しておき、コントローラ２０の起動シーケンスのみをやり直した方が、図４のフローと比較して、コントローラ２０は安定的に起動が出来る可能性が高い。
【０１５９】
また、１度でも不揮発メモリからのプログラム読出しで検証に成功したら、それ以降のフローで検証に失敗するのは、プログラムの改ざんの可能性が高い。このことから、起動シーケンス全体をやり直すよりは、検証が失敗した当該フローにおける検証のやり直しを繰り返した方が、起動シーケンス全体の処理時間としては、図８のフローと比較して短期間で判断できる。
【０１６０】
なお、実施例１乃至実施例３においては、複合機の起動シーケンスのやり直しを、複合機の電源のシャットダウン及び再起動からやり直すものではないが、本発明は、電源のシャットダウン及び再起動により起動シーケンスをやり直す方法を排除するものではない。
【０１６１】
（他の実施例）
本発明は、上述の実施形態の１以上の機能を実現するプログラムを、ネットワーク又は記憶媒体を介してシステム又は装置に供給し、そのシステム又は装置のコンピュータにおける１つ以上のプロセッサーがプログラムを読出し実行する処理でも実現可能である。また、１以上の機能を実現する回路（例えば、ＡＳＩＣ）によっても実現可能である。
【図１】
2020091698.tif 000003
【図２】
2020091698.tif 000004
【図３】
2020091698.tif 000005
【図４】
2020091698.tif 000006
【図５】
2020091698.tif 000007
【図６】
2020091698.tif 000008
【図７】
2020091698.tif 000009
【図８】
2020091698.tif 000010