以下、添付図面を参照して実施形態を詳しく説明する。なお、以下の実施形態は特許請求の範囲に係る発明を限定するものでない。実施形態には複数の特徴が記載されているが、これらの複数の特徴の全てが発明に必須のものとは限らず、また、複数の特徴は任意に組み合わせられてもよい。さらに、添付図面においては、同一の又は同様の構成に同一の参照番号を付し、重複した説明は省略される。
<<1.装置の構成例>>
<1−1.全体的な構成>
本節では、本開示に係る技術がMFPに適用される例を説明する。しかしながら、本開示に係る技術は、MFPに限定されず、例えばプリンタ、スキャナ、ファクシミリ、PC(Personal Computer)、タブレットデバイス及びスマートフォンといった、いかなる種類の情報処理装置に適用されてもよい。特に説明の無い限り、以下に説明する装置、デバイス、モジュール及びチップといった構成要素の各々は、単一のエンティティで構成されてもよく、又は物理的に異なる複数のエンティティから構成されてもよい。
図1は、一実施形態に係る複合機1の概略的な構成の一例を示すブロック図である。図1を参照すると、複合機1は、メインCPU101、DRAM102、操作I/F103、ネットワークI/F104、プリンタ105、スキャナ106、FAX107、HDD108、及び画像処理部109を備える。複合機1のこれら構成要素は、信号バス110を介して相互に接続される。操作I/F103は、操作部111へ接続される。ネットワークI/F104は、ネットワークI/F用フラッシュROM112へ接続される。
メインCPU(Central Processing Unit)101は、複合機1の機能の全般を制御するプロセッサである。DRAM(Dynamic Random Access Memory)102は、メインCPU101のための主記憶デバイスであり、メインCPU101により実行されるプログラム及び関連するデータを一時的に記憶する。操作インタフェース(I/F)103は、操作部111を信号バス110へ接続するためのインタフェースである。操作部111は、ユーザによる複合機1の操作のためのユーザインタフェースを提供するユニットである。操作部111は、例えば、ボタンの押下又はタッチパネルへのタッチといったユーザ操作を受け付けると、対応する操作信号を操作I/F103を介してメインCPU101へ送信する。また、操作部111は、例えば、操作のための情報をディスプレイ(図示せず)の画面上に表示させる。ネットワークI/F104は、複合機1による外部の装置との間の通信のためのインタフェースである。ネットワークI/F104は、例えばLAN(Local Area Network)インタフェースであってもよい。ネットワークI/F用フラッシュROM(Read Only Memory)112は、ネットワークI/F104の動作のためのファームウェアを記憶する不揮発性メモリである。プリンタ105は、画像データにより表現される画像をシートへ印刷するユニットである。スキャナ106は、原稿の画像を光学的に読み取り、光信号を電気信号へ変換して、スキャン画像データを生成するユニットである。ファクシミリ(FAX)107は、公衆回線へ接続され、外部のファクシミリ装置との間でファクシミリ通信を行うユニットである。HDD(Hard Disk Drive)108は、いわゆる二次記憶デバイスである。HDD108は、複合機1の様々な機能により利用されるデータと、メインCPU101により実行されるプログラムのうち正当性の検証を要しないプログラムとを記憶する。HDD108は、プリントジョブ及びスキャンジョブをスプールするためのスプール領域、並びにスキャン画像データを再利用に向けて保存するための保存領域として利用されてもよい。画像処理部109は、ネットワークI/F104を介して受信されるプリントジョブの画像データを、プリンタ105による印刷に適した画像データへ変換する処理モジュールである。画像処理部109は、さらに、スキャナ106により読み取られたスキャン画像データについて、ノイズ除去、色空間の変換、回転及びデータ圧縮といった画像処理を実行し得る。さらに、画像処理部109は、HDD108に記憶される画像データについて任意の種類の画像処理を実行してよい。
図1を参照すると、複合機1は、さらに、フラッシュROM121、サブCPU122及び電源制御部130を含む。メインCPU101、フラッシュROM121及びサブCPU122は、SPI(Serial Peripheral Interface)バス120を介して相互に接続される。
フラッシュROM121は、メインCPU101により実行される1つ以上のプログラムと、複合機1の基本的な設定のための既定の設定値とを記憶する記憶デバイスである。フラッシュROM121に記憶されるプログラムは、例えば、メインCPU101の起動時に実行されるBIOSプログラムを含む。メインCPU101により実行されるいくつかのプログラム(例えば、オペレーティングシステム(OS)及び様々なアプリケーションのためのプログラム)は、フラッシュROM121とは異なる記憶デバイス(例えば、上述したHDD108)に記憶され得る。
サブCPU122は、フラッシュROM121に記憶されているプログラムの正当性をメインCPU101による実行の前に検証する補助的なプロセッサである。プログラムが正当な開発者の意図に反して変化している場合には、検証の結果として、プログラムは正当ではないと判定され得る。一方で、そうした変化が無い場合には、プログラムは正当であると判定され得る。例えば、MFP1に不正にアクセスした第三者がプログラムを改竄した場合に、プログラムは正当性を失う。また、装置の経年劣化に起因してプログラムデータのビットが書き換わった場合にも、プログラムは正当性を失う。サブCPU122による正当性検証の手法について、後にさらに説明する。サブCPU122は、検証の結果としてプログラムが正当であると判定すると、後述する電源制御部130のリセット制御部131へ、検証の完了を通知する。
電源制御部130は、MFP1を構成するモジュールへの電力の供給を制御するユニットである。図中では、外部の商用AC電源からの電力の供給が太線の矢印で示されており、MFP1内の各モジュールへの電力の供給が破線の矢印で簡略的に示されている。電源制御部130は、信号バス110にも接続され、メインCPU101で動作するプログラムから電源制御部130の制御レジスタへのアクセスが可能とされる。
電源制御部130は、さらに、メインCPU101及びサブCPU122のリセットを制御するリセット制御部131を含む。本実施形態において、リセット制御部131は、少なくともリセット回路132及びウォッチドッグタイマ(WDT)133を含み、所定の期間外部からのアクセスが無い場合に、システムリセット信号を発行する。リセット回路132は、リセット信号線134及び1つ以上の追加的な制御信号線135を介してサブCPU122へ接続され、リセット信号線136を介してメインCPU101へ接続される。
リセット信号線134は、リセット回路132からサブCPU122へ出力されるリセット制御信号を搬送する。リセット信号線136は、リセット回路132からメインCPU101へ出力されるリセット制御信号を搬送する。一例として、リセット制御信号は、“Lo”又は“Hi”という2通りの信号レベルを有する(例えば、“Lo”はゼロに相当する電気信号レベル、“Hi”は1に相当する電気信号レベルであり得る)。リセット制御信号の“Lo”レベルは信号の出力先のCPUがリセット(無効化)されるべきことを、“Hi”レベルは当該CPUが通常の動作を行うべきことを意味する。
リセット回路132は、例えば、MFP1の電源が投入されると、サブCPU122へ出力されるリセット制御信号の信号レベルを“Lo”から“Hi”へ切替える。サブCPU122は、この切替えをリセット解除の指示であると解釈する。サブCPU122は、リセット解除の指示に応じて動作を開始し、メインCPU101により実行されるべきプログラムの正当性を検証する。この間、リセット回路132は、メインCPU101へ出力されるリセット制御信号の信号レベルを“Lo”に維持する。リセット回路132は、サブCPU122によるプログラムの検証が完了すると、メインCPU101へ出力されるリセット制御信号の信号レベルを“Lo”から“Hi”へ切替える。メインCPU101は、この切替えをリセット解除の指示であると解釈する。メインCPU101は、リセット解除の指示に応じて動作を開始し、サブCPU122により正当であると判定されたプログラムを実行する。
WDT133は、MFP1が稼働している間、継続的に時間をカウントする(即ち、計時を行う)。WDT133は、予め設定されるタイムアウト閾値にカウンタ値が達すると、リセット回路132にシステムリセットを指示する。リセット回路132は、システムリセットの指示に応じて、サブCPU122及びメインCPU101へ、信号レベルを“Lo”へ設定したリセット制御信号を出力する。それにより、サブCPU122及びメインCPU101がリセットされる。サブCPU122及びメインCPU101のリセット状態(無効化状態)は予め設定される期間維持され、その後にサブCPU122のリセット状態が解除される。こうしたシステムリセットをトリガするリセット制御信号を、本明細書では、システムリセット信号ともいう。リセット回路132は、MFP1を構成する他のモジュールにも、それぞれのモジュールをリセットさせるためのリセット制御信号を出力してもよい。
メインCPU101は、サブCPU122により検証された正当なプログラムの起動後に、WDT133へアクセス可能となる。例えば、メインCPU101は、正当なプログラムを実行することにより動作している間、周期的にリセット制御部131へクリア信号137を出力して、WDT133のカウンタ値をクリアさせる。クリア信号137の出力周期は、上述したシステムリセットの判定のためのタイムアウト閾値よりも短い。それにより、メインCPU101が正常に動作している間、システムリセットの実行が抑制される。メインCPU101に異常が発生すると、このクリア信号137がリセット制御部131へ出力されなくなる結果、リセット制御部131がタイムアウトに応じてシステムリセットをトリガする。言い換えると、リセット制御部131は、メインCPU101が所定の期間にわたり動作していない場合に、WDT133による計時に基づいて、サブCPU122及びメインCPU101をリセットする。クリア信号137は、例えば、リセット制御部131の所定の制御レジスタへの書込みを行う書込み信号であってもよく、又はパルスによってカウンタ値がクリアされるべきことを示すパルス信号であってもよい。WDT133は、クリア信号137の入力に応じて(例えば、所定の制御レジスタへの書込みを検知することに応じて)、カウンタ値をゼロへクリアして、再度ゼロからの計時を行う。
<1−2.基本的な原理>
上述したように、本実施形態では、サブCPU122がMFP1の主要なプログラムの正当性を検証することで、プログラムの改竄及び劣化といったリスクからMFP1が保護される。加えて、MFP1は、WDT133を有することで、システムに異常が発生した際にシステムリセットを実行して、自動的に正常な状態に復帰し得る。しかしながら、サブCPU122によるプログラムの検証が完了するまで、メインCPU101は、動作を開始せず、クリア信号137をリセット制御部131へ出力しない。そのため、サブCPU122によるプログラムの検証に長時間を要した場合に、最終的にシステムが正常に起動できる状況にも関わらず、WDT133においてカウンタ値がタイムアウト閾値に達し、システムリセットが実行される可能性がある。この場合、プログラムの正当性検証はシステムリセット後に最初からやり直しとなるため、システムの起動が長期化する。そればかりか、再度の検証の途中でさらにシステムリセットが行われて、MFP1がいつまでも起動できない事態に陥りかねない。また、サブCPU122が検証失敗時にプログラムの復旧用バージョンを用いて復旧を行う機能を有する場合、復旧用バージョンのフラッシュROM121への書込みが途中で停止する結果として復旧用バージョンのコピーが破損するリスクもある。
上述した不具合を回避を解消するために、一例として、サブCPU122によるプログラムの正当性の検証が完了するまでWDT133による計時を停止する手法が考えられる。しかし、そうした手法では、何らかの原因でサブCPU122に異常が発生した場合に、システムリセットが実行されず、MFP1の正常な状態への復帰が妨げられる。他の例として、WDT133のタイムアウト閾値を、プログラムの正当性検証(及び検証失敗時のプログラムの復旧)の処理時間を包含する程度に十分に大きい値に設定する手法も考えられる。しかし、画一的にタイムアウト閾値を引き延ばせば、メインCPU101の異常発生時のリセットが遅延してしまう。また、サブCPU122向けとメインCPU101向けとで別々のタイムアウト閾値を保持しようとすると、タイマの回路規模が増大し、発生の稀な事象への備えとしては装置のコストが割高となる。
そこで、本実施形態では、サブCPU122が、メインCPU101がWDT133へアクセス可能となる前に、WDT133へアクセスするものとする。より具体的には、サブCPU122は、例えば(メインCPU101により実行されるべき)プログラムの検証が成功裏に完了する前に、リセット制御部131へクリア信号140を出力して、WDT133のカウンタ値をクリアさせる。クリア信号140の出力は周期的に行われてよく、その出力周期は上述したシステムリセットの判定のためのタイムアウト閾値よりも短い。クリア信号140は、例えば、一定の周期を持つパルス信号、所定の制御レジスタへの書込みを行う書込み信号、又は所定の制御コマンドを表すコマンド信号であってもよい。サブCPU122は、内部に有するカウンタ又はタイマを用いて、クリア信号140のパルスの送出を、上記タイムアウト閾値よりも短い出力周期に同期させ得る。こうした構成により、メインCPU101が動作を開始する前の、サブCPU122によるプログラムの正当性検証(及び、復旧)の最中の意図しないシステムリセットの実行を抑制することができる。次節より、ここで説明した原理を実現するための各部の構成について、詳細に説明する。
<<2.各部の詳細>>
<2−1.メインCPUの構成例>
図2は、本実施形態に係るメインCPU101の具体的な構成の一例を示すブロック図である。メインCPU101は、CPUコア201、SPI I/F202、バスI/F203、リセット端子204、及び信号バス209を含む。
CPUコア201は、メインCPU101の機能を遂行するための演算を実行するプロセッサコアである。SPI I/F202は、SPIバス120を介するメインCPU101と他のSPIデバイスとの間の通信のためのインタフェース(SPIマスタともいう)である。バスI/F203は、信号バス110を介するメインCPU101と他のモジュールとの間の通信のためのインタフェースである。リセット端子204は、リセット回路132からリセット信号線136を介して入力されるリセット制御信号を受け付ける端子である。信号バス209は、CPUコア201、SPI I/F202、及びバスI/F203を相互に接続する。
本実施形態において、MFP1の電源が投入された直後に、リセット端子204が受け付けるリセット制御信号のレベルは“Lo”であり、メインCPU101はリセット状態(無効化状態)に維持される。その間、サブCPU122によりプログラムの正当性の検証が行われる。サブCPU122によりプログラムが正当であると判定された場合、リセット制御信号のレベルが“Hi”へ切替わり、CPUコア201は動作を開始する。その動作の冒頭において、CPUコア201は、フラッシュROM121の所定のアドレスに記憶されている(サブCPU122により正当であると判定された)プログラムをSPIバス120を介してDRAM102へ読出し、読出したプログラムを実行する。本実施形態において、メインCPU101により実行されるプログラムは、少なくともMFP1のBIOSプログラムを含み得る。例えば、メインCPU101は、BIOSプログラムを実行してメインCPU101の入出力機能を初期化した後、さらにOS、各モジュールのドライバ及びその他のアプリケーションといったプログラムを実行してMFP1の通常の動作を開始する。メインCPU101は、その動作中に、上述したタイムアウト閾値よりも短い出力周期で、信号バス110を介してクリア信号137をリセット制御部131へ出力して、WDT133のカウンタ値をクリアさせる。それにより、MFP1が正常に動作している間のシステムリセットが抑制される。
<2−2.サブCPUの構成例>
図3は、本実施形態に係るサブCPU122の具体的な構成の一例を示すブロック図である。サブCPU122は、CPUコア301、SPI I/F302、汎用入出力端子303、OTP304、SRAM305、リセット端子306、暗号処理部308、信号バス309、ブートROM310、暗号RAM311及びタイマ回路312を含む。
CPUコア301は、サブCPU122の機能を遂行するための演算を実行するプロセッサコアである。SPI I/F302は、SPIバス120を介するサブCPU122と他のSPIデバイスとの間の通信のためのインタフェース(SPIマスタともいう)である。汎用入出力端子(GPIO)303は、サブCPU122によるリセット制御部131との通信に利用される制御信号線135が接続される端子である。図3の例では、2つの制御信号線135a、136bが示されている。例えば、第1制御信号線135aは、プログラムの検証が成功裏に完了した場合にサブCPU122からリセット制御部131へ出力される検証完了通知信号を搬送する。第2制御信号線135bは、上述したクリア信号140を搬送する。なお、これら信号は、単一の共通的な信号線で搬送されてもよい。OTP(One Time Programmable)304は、製造時に一度だけ書込みが可能であって、書換えが不能なメモリ領域である。本実施形態では、サブCPU122のファームウェアのハッシュ値を公開鍵暗号方式の秘密鍵で暗号化した暗号化済みハッシュ値(即ち、署名)及び後述するTagのアドレスが、予めOTP304に書込まれ得る。SRAM305は、サブCPU122のいわゆるキャッシュメモリであり、CPUコア301により演算用のワークメモリとして使用され得る。リセット端子306は、リセット回路132からリセット信号線134を介して入力されるリセット制御信号を受け付ける端子である。暗号処理部308は、サブCPU122による署名検証を支援する、暗号関連処理に専用のプロセッサである。例えば、暗号処理部308は、サブCPU122のファームウェア及びメインCPU101のプログラムの署名を復号することにより、それぞれの正当なハッシュ値を復元する。暗号処理部308は、プログラムデータからハッシュ値を導出するためのハッシュ計算を行ってもよい。信号バス309は、CPUコア301、SPI I/F302、GPIO303、OTP304、SRAM305、暗号処理部308、ブートROM310、暗号RAM311及びタイマ回路312を相互に接続する。ブートROM310は、サブCPU122のブートプログラム(ブートコードともいう)を予め記憶する記憶デバイスである。暗号RAM311は、暗号処理部308により処理される高い機密性の求められるデータを一時的に記憶する、暗号関連処理に専用のメモリである。タイマ回路312は、サブCPU122が稼働している間に計時を行う回路である。
本実施形態において、MFP1の電源が投入されると、リセット端子306が受け付けるリセット制御信号のレベルは“Lo”から“Hi”へ切替わり、CPUコア301は動作を開始する。その動作の冒頭において、CPUコア301は、ブートROM310から自身のブートプログラムをSRAM305へ読出し、読出したブートプログラムを実行する。CPUコア301は、さらに、正当性検証の対象の1つ以上のプログラムをフラッシュROM121から読出し、読出したプログラムの正当性を検証する。本実施形態において、正当性検証の対象のプログラムは、少なくともMFP1のBIOSプログラムを含む。さらに、正当性検証の対象のプログラムは、サブCPU122の動作のためのファームウェアを含んでもよい。
図4は、本実施形態に係るフラッシュROM121のメモリマップの一例を示す説明図である。図4に示したように、フラッシュROM121は、メインCPUプログラム401、署名402、Tag403、サブCPUファームウェア404、署名405及びROM−ID406を予め記憶する。メインCPUプログラム401は、例えば、メインCPU101のブートの際に実行されるBIOSプログラムである。署名402は、メインCPUプログラム401の正当性検証用の署名(例えば、RSA署名)である。署名402は、(正当な)メインCPUプログラム401のハッシュ値を暗号化することにより予め導出され、フラッシュROM121に記憶され得る。Tag403は、サブCPUファームウェア404が記憶されている記憶領域の先頭のアドレスを示すデータである。Tag403のアドレスは、上述したようにOTP304に記憶される。サブCPUファームウェア404は、CPUコア301により実行されるプログラムコードを含むファームウェアである。署名405は、サブCPUファームウェア404の正当性検証用の署名(例えば、ECDSA署名)である。署名405は、(正当な)サブCPUファームウェア404の全体又は先頭の特定部分に基づいて予め導出され、フラッシュROM121に記憶され得る。ROM−ID406は、メインCPUプログラム401が記憶されている記憶領域の先頭のアドレス、その記憶領域のサイズ及び署名402のアドレスを含むデータである。
図4には、メインCPUのためのプログラム及び署名のセットが1つだけフラッシュROM121に記憶される例が示されている。しかしながら、フラッシュROM121は、かかる例に限定されず、メインCPUのためのプログラム及び署名の複数のセットを記憶してもよい。同様に、図4には、サブCPUのためのファームウェア及び署名のセットが1つだけフラッシュROM121に記憶される例が示されている。しかしながら、フラッシュROM121は、かかる例に限定されず、サブCPUのためのファームウェア及び署名の複数のセットを記憶してもよい。また、ここでは一例として、署名402がRSA署名、署名405がECDSA署名である例を説明したが、各署名は、RSA署名、DSA署名又はECDSA署名といった、いかなる種類のデジタル署名方式に基づいていてもよい。
本実施形態において、サブCPU122のCPUコア301は、プログラムの正当性を検証している間、上述したタイムアウト閾値よりも短い出力周期で、GPIO303を介してクリア信号140をリセット制御部131へ出力する。クリア信号140の出力周期は、例えばタイマ回路312による計時に従って制御され得る。それにより、システムリセットが抑制される。タイマ回路312は、フリーランタイマのように、停止することなく周期的にゼロから(クリア信号の出力周期に相当する)上限値までをカウントしてもよい。代替的に、タイマ回路312は、カウンタ値が上限値に達するとカウントを停止し、クリア信号140の出力後にカウントを再開してもよい。なお、タイマ回路312の代わりに、CPUコア301上で動作するソフトウェアタイマが利用されてもよい。
図4を用いて説明したようなデジタル署名方式に基づいて、検証対象の全てのプログラムが正当であると判定されると、CPUコア301は、クリア信号140の周期的な出力を停止する。同時に、CPUコア301は、GPIO303を介して検証完了通知信号をリセット制御部131へ出力する。それに応じて、上述したように、メインCPU101のリセットが解除され得る。
<2−3.リセット制御部の構成例>
図5は、本実施形態に係るリセット制御部131の具体的な構成の一例を示すブロック図である。リセット制御部131は、リセット回路132、タイマ制御部501、タイマ回路502及びバスI/F503を含む。タイマ制御部501及びタイマ回路502は、図1に示したWDT133を構成する。
タイマ制御部501は、タイマ回路502による計時に基づくタイムアウトの判定、及びタイマ回路502のカウンタ値のクリアを行うコントローラである。タイマ回路502は、時間の経過に沿ってカウンタ値をインクリメントする回路である。バスI/F503は、信号バス110を介するリセット制御部131と他のモジュールとの間の通信のためのインタフェースである。
タイマ回路502は、リセット制御部131への給電の開始又はリセット解除に応じて、カウンタ値をゼロへ初期化し、計時を開始する。タイマ制御部501は、タイマ回路502のカウンタ値を監視し、カウンタ値が予め設定されるタイムアウト閾値に達した場合に、タイムアウトが発生したと判定する。タイムアウトが発生したと判定すると、タイマ制御部501は、システムリセットを指示するためのタイムアウト信号をリセット回路132へ出力する。タイマ制御部501は、タイムアウト信号を出力した後、タイマ回路502のカウンタ値をゼロへクリアし、タイマ回路502に計時を再開させる。
また、タイマ制御部501は、メインCPU101又はサブCPU122からクリア信号が入力されると、タイマ回路502のカウンタ値をゼロへクリアする。各クリア信号は、上述したように、パルス信号のパルス、又は所定の制御アドレスへの制御値の書込みなど、いかなる手法で実現されてもよい。本実施形態では、サブCPU122によりプログラムの正当性が検証されている間、サブCPU122からタイマ制御部501へクリア信号140が周期的に入力され得る。サブCPU122によりプログラムが正当であると判定されると、リセット回路132が、検証完了通知信号の入力に応じて、メインCPU101のリセットを解除する。その後、サブCPU122からのクリア信号140の入力は停止し、代わりにメインCPU101からタイマ制御部501へクリア信号137が周期的に入力され得る。これらクリア信号が上述したタイムアウト閾値により表される期間にわたって入力されない場合には、カウンタ値は、クリアされることなくタイムアウト閾値に達する。すると、タイマ制御部501は、システムに何らかの異常が生じたものと見なし、タイムアウト信号をリセット回路132へ出力する。タイマ制御部501は、検証完了通知信号の入力をトリガとして、メインCPU101からの第2クリア信号の監視(例えば、所定の制御レジスタが示す値の監視)を開始してもよい。
<<3.処理の流れ>>
<3−1.システム起動時の処理>
図6は、本実施形態に係るMFP1のシステム起動時の処理の概略的な流れの一例を示すシーケンス図である。図6に示した処理には、MFP1を操作するユーザに加えて、MFP1の電源制御部130、WDT133、リセット回路132、サブCPU122及びメインCPU101が関与する。なお、以下の説明では、処理ステップをS(ステップ)と略記する。
まず、S601で、電源制御部130は、MFP1を起動するためのユーザ操作を操作部111を介して受け付ける。このユーザ操作に応じて、S602で、電源制御部130は、商用AC電源から供給される電力の各モジュールへの分配を開始する。リセット回路132は、サブCPU122及びメインCPU101へ、“Lo”レベルを示すリセット制御信号を出力する。
S603で、WDT133は、給電の開始に応じて、タイマ回路502による計時を開始する。また、S604で、リセット回路132は、サブCPU122へ出力されるリセット制御信号の信号レベルを“Hi”へ切替えて、サブCPU122のリセットを解除する。
S605で、サブCPU122は、リセット解除に応じて、タイマ回路312による計時を開始する。並列的に、S606で、サブCPU122は、サブCPUファームウェア404の正当性を検証する。ここでは、サブCPUファームウェア404は正当であると判定されるものとする。次いで、S610で、サブCPU122は、メインCPUプログラム401(例えば、BIOSプログラム)の正当性を検証する。
サブCPU122がこのようにプログラムの正当性を検証している間、S611で、タイマ回路312のカウンタ値が第1クリア信号の出力周期を表す閾値に到達し得る。すると、S612で、サブCPU122は、第1クリア信号をWDT133へ出力する(タイマ回路312のカウンタ値はここでクリアされ得る)。S613で、WDT133は、第1クリア信号の入力に応じて、タイマ回路502のカウンタ値をクリアした後に、タイマ回路502による計時を再開する。
図6の例では、サブCPU122によるメインCPUプログラム401の正当性の検証は、さらに続く。S621で、タイマ回路312のカウンタ値が第1クリア信号の出力周期を表す閾値に再び到達し得る。すると、S622で、サブCPU122は、第1クリア信号をWDT133へ出力する(タイマ回路312のカウンタ値はやはりここでクリアされ得る)。S623で、WDT133は、第1クリア信号の入力に応じて、タイマ回路502のカウンタ値をクリアした後に、タイマ回路502による計時を再開する。
ある時点で、サブCPU122によるメインCPUプログラム401の正当性の検証は終了する。ここでは、メインCPUプログラム401もまた正当であると判定されるものとする。すると、S631で、サブCPU122は、検証完了通知信号をリセット回路132へ出力する。そして、S632で、サブCPU122は、スリープ状態へ移行する。
S633で、リセット回路132は、検証完了通知信号のアサートに応じて、メインCPU101へ出力されるリセット制御信号の信号レベルを“Hi”へ切替えて、メインCPU101のリセットを解除する。
S641で、メインCPU101は、リセット解除に応じて、フラッシュROM121から読出されるメインCPUプログラム401(例えば、BIOSプログラム)を実行する。また、S642で、メインCPU101は、計時を開始する。ここでは、メインCPU101は、ソフトウェアタイマを利用するものとする。S643で、メインCPU101は、HDD108から読出されるOSプログラムを実行することにより、OSを起動する。図6には示していないものの、OSの起動に応じて、各モジュールのドライバ及び他のアプリケーションもまた起動され得る。
メインCPU101がこのようにプログラムを実行している間、S651で、タイマのカウンタ値が第2クリア信号の出力周期を表す閾値に到達し得る。すると、S652で、メインCPU101は、第2クリア信号をWDT133へ出力する。S653で、WDT133は、第2クリア信号の入力に応じて、タイマ回路502のカウンタ値をクリアした後に、タイマ回路502による計時を再開する。
こうしたシーケンスにおいて、例えばS631までにサブCPU122に異常が発生し、第1クリア信号の周期的な出力が停止した場合、WDT133のタイマ回路502は、カウンタ値がクリアされないためにタイムアウトし得る。また、S641の後にメインCPU101に異常が発生し、第2クリア信号の周期的な出力が停止した場合、WDT133のタイマ回路502は、やはりカウンタ値がクリアされないためにタイムアウトし得る。一旦WDT133においてタイムアウトが発生すると、WDT133のタイマ制御部501は、リセット回路132へシステムリセットを指示し、リセット回路132は、それに応じてメインCPU101及びサブCPU122をリセットさせる。例えば、メインCPU101及びサブCPU122は、予め設定される期間にわたってリセット状態に維持され、その後、サブCPU122のリセットが解除されて、上述したS604以降の処理ステップが再実行される。
<3−2.サブCPUによる処理>
図7は、本実施形態に係るサブCPU122により実行される処理の流れの一例を示すフローチャートである。
まず、S701で、サブCPU122は、起動した直後にブートROM310からブートプログラムを読出し、読出したブートプログラムを実行する。それにより、サブCPUファームウェア404及び署名405が、SPIバス120を介してフラッシュROM121からSRAM305へ読出される。
次いで、S702で、サブCPU122は、サブCPUファームウェア404の正当性を検証する。例えば、暗号処理部308は、署名405をOTP304に予め記憶される公開鍵で復号して、正当なサブCPUファームウェア404のハッシュ値を導出する。また、暗号処理部308は、サブCPUファームウェア404のプログラムデータからハッシュ値を算出する。これらハッシュ値が互いに一致する場合には、サブCPUファームウェア404は正当である(改竄されておらず、経年劣化により変化してもいない)と判定される。一方、ハッシュ値が一致しない場合には、サブCPUファームウェア404は、開発者の意図に反して変化しているために、正当ではないと判定される。
その後の処理は、S703で、サブCPUファームウェア404の正当性検証の結果に依存して分岐する。サブCPUファームウェア404が正当であると判定された場合、処理はS704へ進む。一方、サブCPUファームウェア404が正当ではないと判定された場合、処理はS709へ進む。
S704で、サブCPU122は、サブCPUファームウェア404をSRAM305へ読出して実行する。次いで、S705で、サブCPU122は、サブCPUファームウェア404に従って動作し、ROM−ID406から導出されるアドレスに基づいて、BIOSプログラム401及び署名402をフラッシュROM121からSRAM305へ読出す。次いで、S706で、サブCPU122は、BIOSプログラム401の正当性を検証する。例えば、暗号処理部308は、署名402を公開鍵で復号して、正当なBIOSプログラム401のハッシュ値を導出する。また、暗号処理部308は、BIOSプログラム401のプログラムデータからハッシュ値を算出する。これらハッシュ値が互いに一致する場合には、BIOSプログラム401は正当である(改竄されておらず、経年劣化により変化してもいない)と判定される。一方、ハッシュ値が一致しない場合には、BIOSプログラム401は、開発者の意図に反して変化しているために、正当ではないと判定される。
その後の処理は、S707で、BIOSプログラム401の正当性検証の結果に依存して分岐する。BIOSプログラム401が正当であると判定された場合、処理はS708へ進む。S708で、サブCPU122は、GPIO303を制御して、検証完了通知信号をアサートすることにより、リセット制御部131へ検証の完了を通知する。そして、処理はS709へ進む。一方、BIOSプログラム401が正当ではないと判定された場合、S708が実行されることなく、処理はS709へ進む。
上述したS702〜S708を実行している間、サブCPU122は、リセット制御部131への周期的な第1クリア信号の出力を継続する。具体的には、まず、サブCPU122によりタイマ回路312が起動される。GPIO303のポートは初期化され、例えば検証完了通知信号の信号レベルは“Lo”に設定される。そして、タイマ回路312がカウンタ値をインクリメントすることにより、タイマが進行する。
サブCPU122は、例えば、タイマ回路312からの割込みに応じて、第1クリア信号の出力周期が経過したかを判定する。第1クリア信号の出力周期が経過した場合、サブCPU122は、GPIO303を制御して第1クリア信号をリセット制御部131へ出力し、及び、タイマ回路312のカウンタ値をクリアする。
S709で、サブCPU122は、電力を節約するために、スリープ状態へ移行する。スリープ状態において、サブCPU122は、第1クリア信号を出力しない(又はアサートしない)。サブCPU122のスリープ状態は、MFP1のシステムリセットが実行されるまで維持されてよい。但し、サブCPU122をプログラムの正当性の検証以外の用途に再利用するために、サブCPU122をスリープ状態へ移行させなくてもよく、又は一旦スリープ状態へ移行したサブCPU122が(例えば、割込み信号に応じて)通常状態へ戻ってもよい。
図7に示した例では、サブCPU122は、プログラムの正当性の検証に失敗した場合に、即座にS709でスリープ状態へ移行する。結果的に、リセット制御部131へクリア信号が入力されなくなり、WDTのタイムアウトが発生し、サブCPU122及びメインCPU101はリセットされる。こうした構成によれば、サブCPUファームウェア404のプログラムコードを最小にすることができる。S708を経てS709でサブCPU122がスリープ状態へ移行した場合には、メインCPU101がリセット制御部131へ第2クリア信号を出力するため、メインCPU101に異常が発生しない限り、システムリセットは行われない。
<3−3.メインCPUによる処理>
図8は、本実施形態に係るメインCPU101により実行される処理の流れの一例を示すフローチャートである。
まず、S801で、メインCPU101は、リセット解除に応じて、BIOSプログラムをフラッシュROM121からDRAM102へ読出す。次いで、S802で、メインCPU101は、読出したBIOSプログラムを実行する。それにより、メインCPU101の基本的な入出力機能が初期化される。
次いで、S803で、メインCPU101は、OSを構成するプログラムをHDD108からDRAM102へ読出す。次いで、S804で、メインCPU101は、読出したプログラムを実行することにより、MFP1のOSを起動する。次いで、S805で、メインCPU101は、MFP1のモジュール(例えば、操作I/F103、ネットワークI/F104、プリンタ105、スキャナ106、FAX107及び画像処理部109)の各々を初期化して、MFP1をセットアップする。その結果、S806で、MFP1は、通常の動作を行うことが可能となる。MFP1の動作は、例えばユーザ操作を通じてMFP1の動作終了が指示されるまで継続される(S807)。
上述したS802〜S806を実行している間、メインCPU101は、リセット制御部131への周期的な第2クリア信号の出力を継続する。具体的には、まず、メインCPU101によりソフトウェアタイマが起動される。ソフトウェアタイマは、内部変数であるカウンタ値をインクリメントすることにより進行する。メインCPU101は、第2クリア信号の出力周期が経過したと判定すると、第2クリア信号をリセット制御部131へ出力して、リセット制御部131の制御レジスタ(例えば、WDTクリアレジスタ)に所定の値(例えば、“1”)を書込む。同時に、メインCPU101は、ソフトウェアタイマのカウンタ値をクリアする。S808でMFP1の動作が終了する場合(又はメインCPU101に何らかの異常が発生した場合)、第2クリア信号の出力は停止する。
<3−4.WDTによる処理>
図9は、本実施形態に係るWDT133により実行される処理の流れの一例を示すフローチャートである。
まず、S901で、WDT133は、給電の開始に応じて、タイマ回路502を起動し、タイマ回路502による計時を開始させる。S902で、タイマは進行し、即ちタイマ回路502がカウンタ値をインクリメントする。WDT133は、S903で、サブCPU122からの検証完了の通知を待ち受ける。
サブCPU122からの検証完了が通知されるまで、WDT133は、S904で、サブCPU122からの第1クリア信号の入力を監視する。サブCPU122から第1クリア信号が入力された場合、WDT133は、S905で、タイマ回路502のカウンタ値をクリアし、計時をゼロから再開させる。その後、処理はS902へ戻る。サブCPU122から第1クリア信号が入力されない場合、WDT133は、S906で、タイマ回路502のカウンタ値がタイムアウト閾値に達したかを判定する。カウンタ値がタイムアウト閾値に達していない場合、処理はS902へ戻る。カウンタ値がタイムアウト閾値に達した場合、処理はS920へ進む。
サブCPU122からの検証完了が通知されると、WDT133は、S911で、メインCPU101によるクリア制御の監視を開始する。S912で、タイマは引き続き進行する。S913で、WDT133は、メインCPU101からの第2クリア信号の入力(例えば、WDTクリアレジスタへの書込み)を監視する。メインCPU101から第2クリア信号が入力された場合、WDT133は、S914で、タイマ回路502のカウンタ値をクリアし、計時をゼロから再開させる。その後、処理はS912へ戻る。メインCPU101から第2クリア信号が入力されない場合、WDT133は、S915で、タイマ回路502のカウンタ値がタイムアウト閾値に達したかを判定する。カウンタ値がタイムアウト閾値に達していない場合、処理はS912へ戻る。カウンタ値がタイムアウト閾値に達した場合、処理はS920へ進む。
S920で、WDT133は、MFP1(サブCPU122又はメインCPU101)に異常が発生したものと見なし、システムリセットをリセット回路132へ指示する。
<3−5.リセット回路による処理>
図10は、本実施形態に係るリセット回路132により実行される処理の流れの一例を示すフローチャートである。
まず、S1001で、リセット回路132は、給電の開始に応じて、サブCPU122のリセットを解除する。次いで、S1002で、リセット回路132は、サブCPU122からの検証完了の通知を待ち受ける。サブCPU122から検証完了が通知されない場合、S1003で、リセット回路132は、WDT133からシステムリセットが指示されたかを判定する。システムリセットが指示された場合、処理はS1020へ進む。一方、システムリセットが指示されない場合、処理はS1002へ戻る。
サブCPU122から検証完了が通知された場合、S1011で、リセット回路132は、メインCPU101のリセットを解除する。次いで、S1012で、リセット回路132は、WDT133からのシステムリセットの指示を待ち受ける。システムリセットが指示された場合、処理はS1020へ進む。
S1020で、リセット回路132は、WDT133からのシステムリセットが指示された(例えば、タイムアウト信号が入力された)ため、メインCPU101及びサブCPU122をリセットする(システムリセット信号を発行する)。
図9及び図10を用いて説明したようなリセット制御によれば、サブCPU122がプログラムの正当性を検証している間に、WDTのタイムアウトに起因して無用なシステムリセットが実行されることが防止される。また、正当性の検証が完了する前はサブCPU122が、検証完了後はメインCPU101がWDTのカウンタ値を周期的にクリアすることで、WDTにおいてタイムアウト閾値を切替える必要性が無く、WDTの簡易な構成が維持される。
<<4.変形例>>
本発明は上記実施形態に限定されず、様々な変形が可能である。例えば、上述した実施形態では、サブCPU122が第1クリア信号を周期的に出力し、WDT133が第1クリア信号の入力の都度タイマ回路502のカウンタ値をクリアする例を説明した。これに対し、一変形例において、サブCPU122は第1クリア信号を一度だけ出力し、WDT133が第1クリア信号の入力に応じてタイマ回路502による計時を停止してもよい。タイマ回路502による計時は、例えばプログラムの正当性の検証が成功した後に再開され得る。こうした変形例によれば、サブCPU122による周期的な信号出力を不要とし、サブCPUファームウェア404のサイズを削減することができる。この変形例に係るWDT133により実行される処理の流れの一例を、図11に示している。
まず、S1101で、WDT133は、給電の開始に応じて、タイマ回路502を起動し、タイマ回路502による計時を開始させる。S1102で、タイマは進行し、即ちタイマ回路502がカウンタ値をインクリメントする。WDT133は、S1103で、サブCPU122からの検証完了の通知を待ち受ける。
サブCPU122からの検証完了が通知されるまで、WDT133は、S1104で、サブCPU122からの第1クリア信号の入力を監視する。サブCPU122から第1クリア信号が入力された場合、WDT133は、S1105で、タイマ回路502のカウンタ値をクリアし、S1106で、計時を停止する。その後、WDT133は、引き続きサブCPU122からの検証完了の通知を待ち受ける。
サブCPU122から第1クリア信号が入力されない場合、WDT133は、S1108で、タイマ回路502のカウンタ値がタイムアウト閾値に達したかを判定する。カウンタ値がタイムアウト閾値に達していない場合、処理はS1102へ戻る。カウンタ値がタイムアウト閾値に達した場合、処理はS1120へ進む。なお、S1108の判定は、S1106で計時が停止されている場合には行われなくてよい。
サブCPU122からの検証完了が通知されると、WDT133は、S1111で、メインCPU101によるクリア制御の監視を開始する。S1106で計時が停止されている場合には、WDT133は、検証完了の通知に応じて計時を再開する。S1112で、タイマは進行する。S1113で、WDT133は、メインCPU101からの第2クリア信号の入力(例えば、WDTクリアレジスタへの書込み)を監視する。メインCPU101から第2クリア信号が入力された場合、WDT133は、S1114で、タイマ回路502のカウンタ値をクリアし、計時をゼロから再開させる。その後、処理はS1112へ戻る。メインCPU101から第2クリア信号が入力されない場合、WDT133は、S1115で、タイマ回路502のカウンタ値がタイムアウト閾値に達したかを判定する。カウンタ値がタイムアウト閾値に達していない場合、処理はS1112へ戻る。カウンタ値がタイムアウト閾値に達した場合、処理はS1120へ進む。
S1120で、WDT133は、MFP1(サブCPU122又はメインCPU101)に異常が発生したものと見なし、システムリセットをリセット回路132へ指示する。
他の変形例において、サブCPU122は、正当性検証の対象のプログラムが正当ではないと判定した場合に、当該プログラムの復旧用バージョンを用いて、当該プログラムを復旧してもよい。こうしたプログラムの復旧用バージョンを、ゴールデンマスタともいう。ゴールデンマスタは、例えば、サブCPU122によりアクセス可能なROMの保護領域(書換え不能な領域)に予め記憶される。そして、サブCPU122は、プログラムの検証に失敗した場合に、スリープ状態へ移行する代わりに、ゴールデンマスタを検証に失敗したプログラムに上書きする。その後、システムリセットが行われることで、復旧したプログラムを用いてMFP1が正常に起動し得る。本変形例において、サブCPU122は、プログラムを復旧している間にも、周期的にリセット制御部131へ第1クリア信号を出力して、WDTのカウンタ値をクリアさせる。それにより、ゴールデンマスタを用いたプログラムの復旧の途中でシステムリセットが実行されることを回避し、システムリセットの無用な再実行及びプログラムの破損といった不具合を防止することができる。
他の変形例において、リセット制御部131は、サブCPU122からの第1クリア信号の入力回数を計数し、当該入力回数が閾値を上回る場合に、第1クリア信号の入力に応じてWDTのカウンタ値をクリアしなくてもよい。かかる構成によれば、サブCPU122において処理が無限ループに陥っているなどの原因で、第1クリア信号は出力されるものの検証が終了せずシステムが起動しない不具合が発生した場合に、システムリセットを強制的に実行してその不具合を解消できる。
また別の変形例において、リセット制御部131は、WDTがタイムアウトする前に、第1クリア信号の出力をサブCPU122へ要求してもよい。サブCPU122は、自らに異常が発生していない場合には、リセット制御部131からの当該要求に応じて、第1クリア信号をリセット制御部131へ出力し得る。かかる構成によれば、サブCPU122において何らかの原因で第1クリア信号の出力が遅延しているものの、プログラムの検証は成功裏に終了し得る見込みである場合に、システムリセットを回避してシステムの起動を助けることができる。
なお、上で言及したいずれの信号についても、信号の形式は説明したものとは異なってよい。例えば、各信号の極性又は信号レベル(“Hi”又は“Lo”)は、説明した例とは逆であってもよい。また、リセット制御部131は、電源制御部130に含まれる代わりに、電源制御部130から独立したモジュールとして信号バス110へ接続されてもよい。また、MFP1の構成要素の一部が、システムオンチップ(SoC)へ集積されてもよい。
<<5.まとめ>>
ここまで、図1〜図10を用いて、本開示の実施形態について詳細に説明した。上述した実施形態では、検証手段により正当であると判定されたプログラムを実行手段が実行する情報処理装置において、実行手段がリセット制御用のタイマ(WDT)へアクセス可能となる前に、検証手段がWDTへアクセスしてカウンタ値をクリアする。WDTは、カウンタ値が所定のタイムアウト閾値に達した場合に、検証手段及び実行手段をリセットする。かかる構成によれば、主たるプロセッサ(実行手段)が動作する前の、補助的なプロセッサ(検証手段)によるプログラムの正当性検証が完了する前にWDTがタイムアウトすることが回避される。それにより、検証が正常に進行している間にシステムリセットがトリガされないため、システムの正常な起動を担保することが可能となる。
上述した実施形態では、検証手段は、上記タイムアウト閾値よりも短い出力周期で、WDTのカウンタ値を周期的にクリアし得る。かかる構成によれば、単一のカウンタ値を参照する既存のWDTの構成を大きく変更することなく、システムの起動を阻害しない形で、WDTを有するシステムにセキュアブート技術を組合せることができる。また、検証手段に異常が発生した場合には、その異常をWDTのタイムアウトによって捕捉して、システムリセットを実行することができる。
また、上述した実施形態では、検証手段は、上記プログラムが正当であると判定した場合に、WDTのカウンタ値をクリアするためのクリア信号の周期的な出力を停止し得る。かかる構成によれば、実行手段が動作を開始した後に、検証手段によってWDTのカウンタ値がクリアされないため、主たるプロセッサである実行手段の異常をも適切にWDTによって捕捉することができる。
また、上述した実施形態では、検証手段は、上記プログラムが正当であると判定した場合に、上記プログラムの検証完了をリセット制御手段へ通知し、その通知に応じて、WDTにおける実行手段からのクリア信号の監視が開始され得る。かかる構成によれば、WDTは、検証完了の通知の前には検証手段からのクリア信号のみを、検証完了の通知の後には実行手段からのクリア信号のみを監視すればよいため、WDTの動作の負荷が増大することを回避することができる。
<<6.その他の実施形態>>
上記実施形態は、1つ以上の機能を実現するプログラムをネットワーク又は記憶媒体を介してシステム又は装置に供給し、そのシステム又は装置のコンピュータにおける1つ以上のプロセッサがプログラムを読み出して実行する処理の形式でも実現可能である。また、1つ以上の機能を実現する回路(例えば、ASIC)によっても実現可能である。
本発明は上述した実施形態に制限されるものではなく、発明の精神及び範囲から逸脱することなく、様々な変更及び変形が可能である。したがって、発明の範囲を公にするために請求項を添付する。