(57)【要約】【課題】セキュリティレベルを下げずに、ブート時の処理時間を短くする。【解決手段】取得部１１Ａは、公開鍵と、当該公開鍵に対応する秘密鍵で生成された署名と、当該署名に対応付けられたプログラムとを取得する。また、署名検証部１２Ａは、取得部１１Ａにより取得されたブートプログラムをブートする前に、取得部１１Ａにより取得された公開鍵と、署名とを用いて署名検証を行う。また、算出部１３Ａは、署名検証部１２Ａによる署名検証の結果が適切である場合、機器固有値を用いて、第１ＭＡＣ値を算出して、当該第１ＭＡＣ値を記憶する。ブート部１４Ａは、ブート対象プログラムのブート時に、再度、機器固有値を用いて第２ＭＡＣ値を算出し、当該第２ＭＡＣ値と、記憶されている第１ＭＡＣ値とを比較してブート対象プログラムが正当であることを判定して、当該判定結果に基づいてブートを実行する。【選択図】図１
2018194879.tif 000002
【特許請求の範囲】
【請求項１】
公開鍵と、当該公開鍵に対応する秘密鍵で生成された署名と、当該署名に対応付けられたプログラムとを取得する取得部と、
前記取得部により取得されたプログラムをブートする前に、前記取得部により取得された公開鍵と、前記署名とを用いて署名検証を行う署名検証部と、
前記署名検証部により、前記署名が適切であることが検証された場合、自装置を識別する情報を用いて、前記プログラムが正当に製造されたものであり、且つ改ざんされていないことを判定するための判定値を算出して、当該判定値を記憶する算出部と、
前記プログラムのブート時に、前記自装置を識別する情報を用いて判定値を再度算出し、当該再度算出した判定値と、記憶されている判定値とを比較して前記プログラムが正当に製造されたものであり、且つ改ざんされていないことを判定する判定処理を実行して、当該判定結果に基づいてブートを実行するブート部と、
を備える半導体装置。
【請求項２】
前記取得部は、共通鍵により暗号化されたプログラムおよび署名を取得すると共に、当該共通鍵を取得し、
前記署名検証部は、前記取得部により取得された共通鍵を用いてプログラムおよび署名を復号して、前記公開鍵と復号した署名とを用いて署名検証を行い、
前記算出部は、前記自装置を識別する情報を用いて鍵を生成し、当該鍵を用いて前記算出した判定値と前記プログラムとを再暗号化し、
前記ブート部は、前記プログラムおよび前記記憶された判定値を前記算出部により生成された鍵を用いて復号して、前記判定処理を実行する、請求項１に記載の半導体装置。
【請求項３】
前記プログラムを修正した修正プログラムを取得し、当該修正プログラムを反映させるプログラム修正部をさらに備え、
前記算出部は、前記プログラム修正部により修正されると、修正が反映されたプログラムに対して判定値を再度算出し、記憶する、請求項１に記載の半導体装置。
【請求項４】
プログラムをブートする半導体装置で実行されるブート方法であって、
前記半導体装置が、公開鍵と、当該公開鍵に対応する秘密鍵で生成された署名と、当該署名に対応付けられたプログラムとを取得する取得ステップと、
前記取得ステップで取得したプログラムをブートする前に、前記取得ステップで取得した公開鍵と、前記署名とを用いて署名検証を行う署名検証ステップと、
前記署名検証ステップで、前記署名が適切であることを検証した場合、自装置を識別する情報を用いて、前記プログラムが正当に製造されたものであり、且つ改ざんされていないことを判定するための判定値を算出して、当該判定値を記憶する算出ステップと、
前記プログラムのブート時に、前記自装置を識別する情報を用いて前記判定値を再度算出し、当該判定値と、記憶されている判定値とを比較して前記プログラムが正当に製造されたものであり、且つ改ざんされていないことを判定する判定処理を実行して、当該判定結果に基づいてブートを実行するブートステップと、
を含むブート方法。
【請求項５】
公開鍵と、当該公開鍵に対応する秘密鍵で生成された署名と、当該署名に対応付けられたブート対象のプログラムとを取得する半導体装置に、
前記ブート対象のプログラムをブートする前に、前記公開鍵と、前記署名とを用いて署名検証を行う署名検証ステップと、
前記署名検証ステップで、前記署名が適切であることを検証した場合、自装置を識別する情報を用いて、前記ブート対象のプログラムが正当に製造されたものであり、且つ改ざんされていないことを判定するための判定値を算出して、当該判定値を記憶する算出ステップと、
前記ブート対象のプログラムのブート時に、前記自装置を識別する情報を用いて判定値を再度算出し、当該再度算出した判定値と、記憶されている判定値とを比較して前記ブート対象のプログラムが正当に製造されたものであり、且つ改ざんされていないことを判定する判定処理を実行して、当該判定結果に基づいてブートを実行するブートステップと、
を実行させる、ブートプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、半導体装置、ブート方法、およびブートプログラムに関するものである。
【背景技術】
【０００２】
組み込み機器等に対して第三者（意図しない者）が作成または改ざんしたプログラムの実行を防止したいという要求が近年高まっている。この要求を実現する技術の一つとしてプログラムの完全性の確認と認証を行うセキュアブートがある（例えば、特許文献１参照）。具体的に、特許文献１には、ブート時にソフトウェアモジュールのコードイメージのハッシュ演算を行い、その結果と証明書の計測値を照合する旨が記載されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】国際公開第２００９／０４４５３３号
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、ハッシュ演算は、起動対象のプログラムサイズに比例して演算時間が長くなるので、プログラムサイズが大きい場合、ブートを実行するための処理時間が長くなるという問題点がある。よって、セキュリティレベルを下げずに、ブート時の処理時間を短くすることが望まれる。
【０００５】
その他の目的と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
【課題を解決するための手段】
【０００６】
本願において開示される発明のうち、代表的なものの概要を簡単に説明すれば、以下のとおりである。
【０００７】
一実施の形態による半導体装置では、取得部が、公開鍵と、当該公開鍵に対応する秘密鍵で生成された署名と、当該署名に対応付けられたプログラムとを取得する。また、署名検証部が、取得部により取得されたプログラムをブートする前に、取得部により取得された公開鍵と、署名とを用いて署名検証を行う。また、算出部が、署名検証部により、署名が適切であることが検証された場合、自装置を識別する情報を用いて、プログラムが正当に製造されたものであり、且つ改ざんされていないことを判定するための判定値を算出して、当該判定値を記憶する。また、ブート部が、プログラムのブート時に、自装置を識別する情報を用いて判定値を再度算出し、当該再度算出した判定値と、記憶されている判定値とを比較してプログラムが正当に製造されたものであり、且つ改ざんされていないことを判定する判定処理を実行して、当該判定結果に基づいてブートを実行する。
【発明の効果】
【０００８】
上記一実施の形態によれば、セキュリティレベルを下げずに、ブート時の処理時間を短くすることができる。
【図面の簡単な説明】
【０００９】
【図１】第１実施形態におけるプログラム実行装置の構成例について概要を示した図である。
【図２】第１実施形態におけるプログラム提供装置が、プログラム実行装置へ送信するプログラムを生成する手順を概念的に説明する図である。
【図３】プログラム実行装置のハードウェア構成図である。
【図４】第１実施形態におけるブートプログラム、ブート対象プログラム、および署名を取得した際の記憶状態を示す図である。
【図５】第１実施形態における署名検証およびブート前のＭＡＣ値を算出する際の状態を示す図である。
【図６】第１実施形態におけるブート前におけるブート対象プログラムおよび第１ＭＡＣ値の記憶状態を示す図である。
【図７】第１実施形態におけるブート時におけるブート対象プログラム、第１ＭＡＣ値、および第２ＭＡＣ値の記憶状態を示す図である。
【図８】第１実施形態におけるプログラム実行装置がブート対象のプログラムをブートする処理手順を示すフローチャートである。
【図９】第１実施形態における処理時間の比較例を示す図である。
【図１０】第２実施形態に係るプログラム実行装置の構成例について概要を示した図である。
【図１１】第２実施形態におけるプログラム提供装置が、プログラム実行装置へ送信するプログラムを生成する手順を概念的に説明する図である。
【図１２】第２実施形態におけるブートプログラム、ブート対象プログラム、および署名を取得した際の記憶状態を示す図である。
【図１３】第２実施形態における署名検証およびブート前のＭＡＣ値を算出する際の状態を示す図である。
【図１４】第２実施形態におけるブート前におけるブート対象プログラムおよび第１ＭＡＣ値の記憶状態を示す図である。
【図１５】第２実施形態におけるブート時におけるブート対象プログラム、第１ＭＡＣ値、および第２ＭＡＣ値の記憶状態を示す図である。
【図１６】第２実施形態におけるプログラム実行装置がブート対象のプログラムをブートする処理手順を示すフローチャートである。
【図１７】第２実施形態における処理時間の比較例を示す図である。
【図１８】第３実施形態に係るプログラム実行装置の構成例について概要を示した図である。
【図１９】第３実施形態に係る修正プログラムを取得した際の記憶状態を示す図である。
【図２０】第３実施形態に係るブート対象のプログラムと第１ＭＡＣ値の修正をした状態を示す図である。
【図２１】プログラム実行装置が修正プログラムを取得した際に、プログラムの修正を反映して第１ＭＡＣ値を更新する処理手順を示すフローチャートである。
【発明を実施するための形態】
【００１０】
以下、本発明の実施の形態を図面に基づいて詳細に説明する。なお、実施の形態を説明するための全図において、同一部には原則として同一の符号を付し、その繰り返しの説明は省略する。一方で、ある図において符号を付して説明した部位について、他の図の説明の際に再度の図示はしないが同一の符号を付して言及する場合がある。
【００１１】
＜第１実施形態＞
図１は、第１実施形態のプログラム実行装置の構成例について概要を示した図である。第１実施形態のプログラム実行装置１Ａは、取得部１１Ａ、署名検証部１２Ａ、算出部１３Ａ、およびブート部１４Ａなどの各部を含む。なお、プログラム実行装置１Ａは、プログラム提供装置２Ａと有線又は無線により接続しており、プログラム提供装置２Ａと互いに情報を送受信することができる。プログラム実行装置１Ａは、ブート対象のプログラム（例えば、エンドユーザへ提供するサービスを実行するアプリケーションプログラム）を実行する装置であり、当該ブート対象のプログラムを実行可能な情報処理装置、半導体装置などである。ここでブートとは、ブート対象のプログラムを実行するまたは実行可能な状態にすることをいう。プログラム実行装置１Ａは、例えば、パーソナルコンピュータ、携帯電話機などである。また、プログラム実行装置１Ａは、産業機械、自動車等を制御するコンピュータでもよい。また、プログラム実行装置１Ａは、複数の装置により実現されてもよい。
【００１２】
プログラム提供装置２Ａは、ブート対象のプログラムやブートプログラム（ブートを実行するプログラム）をプログラム実行装置１Ａへ提供（送信）する装置であり、情報処理装置、半導体装置などである。プログラム提供装置２Ａは、例えば、パーソナルコンピュータ、サーバ装置などである。また、プログラム提供装置２Ａは、複数の装置により実現されてもよい。例えば、別々の事業者の装置により、プログラム提供装置２Ａが実現されてもよい。
【００１３】
取得部１１Ａは、公開鍵と、当該公開鍵に対応する秘密鍵で生成された署名と、当該署名に対応付けられたブート対象プログラムとを取得する部分である。具体的に、取得部１１Ａは、プログラム提供装置２Ａから公開鍵を含むブートプログラムを取得し、当該ブートプログラムを記憶する。また、取得部１１Ａは、ブート対象プログラムと当該ブート対象プログラムの署名とをプログラム提供装置２Ａから取得し、ブート対象プログラムと署名とを記憶する。
【００１４】
ここで、図２を用いて、プログラム提供装置２Ａが、プログラム実行装置１Ａへ送信するプログラムを生成する手順を説明する。図２は、プログラム提供装置２Ａが、プログラム実行装置１Ａへ送信するプログラムを生成する手順を概念的に説明する図である。
【００１５】
前提として、プログラム提供装置２Ａは、公開鍵と、当該公開鍵に対応する秘密鍵を保持しているものとする。また、プログラム提供装置２Ａは、ブートプログラムとブート対象のプログラムも保持しているものとする。
【００１６】
まず、プログラム提供装置２Ａは、ブートプログラムに公開鍵を実装させる（ステップＳ１）。続いて、プログラム提供装置２Ａは、ブート対象プログラム全体をハッシュ演算した結果に対して秘密鍵を用いた演算をして署名を生成する（ステップＳ２）。続いて、プログラム提供装置２Ａは、ブート対象プログラムと署名とを対応付ける処理（連接）をする（ステップＳ３）。
【００１７】
このように、プログラム提供装置２Ａは、公開鍵を含むブートプログラムを生成し、ブートプログラムと署名とを対応付ける。また、プログラム提供装置２Ａは、当該ブートプログラムをプログラム実行装置１Ａへ送信すると共に、ブート対象プログラムと署名とを対応付けてプログラム実行装置１Ａへ送信する。
【００１８】
図１に戻り、署名検証部１２Ａは、取得部１１Ａにより取得されたブート対象プログラムをブートする前に、取得部１１Ａにより取得された公開鍵と、署名とを用いて署名検証を行う部分である。具体的に、署名検証部１２Ａは、ブートする前に、ブート対象プログラム全体をハッシュ演算した結果に対し、公開鍵を用いた演算を行うことにより、署名検証を行う。署名検証部１２Ａは、署名検証の結果が適切である場合、その旨を算出部１３Ａへ通知する。また、署名検証部１２Ａは、署名検証の結果が適切でない場合、署名が適切でない旨を出力する等のエラー処理をする。
【００１９】
算出部１３Ａは、署名検証部１２Ａによる署名検証の結果が適切である場合、自装置を識別する情報（機器固有値）を用いて、ブート対象プログラムが正当に製造されたものであり、且つ改ざんされていないことを判定するための判定値を算出して、当該判定値を記憶する部分である。
【００２０】
算出部１３Ａは、署名検証部１２Ａから署名検証の結果が適切である旨を受信すると、機器固有値を生成する。算出部１３Ａは、例えば、生成日時と乱数とを組み合わせた情報を、機器固有値として生成する。続いて、算出部１３Ａは、当該機器固有値を元にブート対象プログラムのＭＡＣ値（第１ＭＡＣ値）を判定値として計算し、当該ＭＡＣ値を記憶する。このＭＡＣ値は、正当であることが判定でき、且つ改ざん検出が可能な値である。なお、算出部１３Ａは、記憶している署名をＭＡＣ値に置き換えるようにしてもよい。また、ＭＡＣ値以外の正当であることが判定でき、且つ改ざん検出が可能な値を適用するようにしてもよい。
【００２１】
ブート部１４Ａは、ブート対象プログラムのブート処理をする部分である。具体的に、ブート部１４Ａは、ブート対象プログラムのブート時（例えば、プログラム実行装置１Ａの電源が投入された場合やプログラム実行装置１Ａがリセット（再起動）された場合等）に、機器固有値を用いてＭＡＣ値（第２ＭＡＣ値）を再度算出する。続いて、ブート部１４Ａは、当該第２ＭＡＣ値と、記憶されている第１ＭＡＣ値とを比較してブート対象プログラムが正当であり、且つ改ざんしていないことを判定する判定処理（ＭＡＣ検証）を実行して、当該判定結果に基づいてブートを実行する。
【００２２】
＜プログラム実行装置のハードウェア構成図＞
続いて、プログラム実行装置１（プログラム実行装置１Ａ、１Ｂ、１Ｃ）のハードウェア構成図の説明をする。プログラム実行装置１は、図３に示すように、ＭａｓｋＲＯＭ１０１、演算器１０２、機器固有値生成部１０３、揮発性メモリ１０４、不揮発性メモリ１０５、およびインタフェース部１０６を含むコンピュータシステムとして構成されている。ここで、インタフェース部１０６は、通信インタフェースなどの外部の装置との入出力を受け付けるインタフェースである。プログラム実行装置１は、図３に示すＭａｓｋＲＯＭ１０１、演算器１０２、揮発性メモリ１０４、および不揮発性メモリ１０５等のハードウェア上に所定のプログラム（ブートプログラム、ブート対象プログラム等）を読み込ませることにより、演算器１０２の制御のもとで機器固有値生成部１０３、インタフェース部１０６を動作させる。なお、ＭａｓｋＲＯＭ１０１のかわりに、ＯＴＰＲＯＭ（One Time Programmable ROM）などの、記憶する機会が限定される記憶手段を適用してもよい。
【００２３】
＜ブート対象プログラム等のデータ遷移＞
続いて、図４〜図７を用いて、ブートを実行するまでのブート対象プログラム等のデータ遷移を説明する。まず、図４にブートプログラム、ブート対象プログラム、および署名を取得した際の記憶状態を示す。演算器１０２は、プログラム提供装置２Ａからインタフェース部１０６を介して、ブートプログラム、ブート対象プログラム、および署名を取得すると、ブートプログラムをＭａｓｋＲＯＭ１０１に記憶する。また、演算器１０２は、ブート対象プログラムおよび署名を不揮発性メモリ１０５に記憶する。このように、演算器１０２およびインタフェース部１０６は、取得部１１Ａとして機能する。
【００２４】
続いて、図５に署名検証およびブート前のＭＡＣ値（第１ＭＡＣ値）を算出する際の状態を示す。演算器１０２は、署名検証時に、ブートプログラムを実行し、不揮発性メモリ１０５に記憶されているブート対象プログラムおよび署名を揮発性メモリ１０４へ移動またはコピーする。揮発性メモリ１０４へ移動またはコピーする方法は、予め記憶されている設定ファイルを参照して移動またはコピーする等がある。
【００２５】
演算器１０２は、ブートプログラムを実行し、ブート対象プログラム全体をハッシュ演算した結果に対し、公開鍵を用いた演算を行うことにより、署名検証を行う。このように、演算器１０２は、署名検証部１２Ａとして機能する。この署名検証が適切である場合、機器固有値生成部１０３は、機器固有値を算出し、演算器１０２が、当該機器固有値を元にブート対象プログラムの第１ＭＡＣ値を算出する。このように、演算器１０２および機器固有値生成部１０３が、算出部１３Ａとして機能する。
【００２６】
続いて、図６にブート前におけるブート対象プログラムおよび第１ＭＡＣ値の記憶状態を示す。演算器１０２が、第１ＭＡＣ値を算出すると、ブート対象プログラムを不揮発性メモリ１０５に移動またはコピーすると共に、署名を置き換えて第１ＭＡＣ値を不揮発性メモリ１０５へ移動またはコピーする。このように、プログラム実行装置１Ａは、ブート実行前に、署名検証を済ませておき、第１ＭＡＣ値を記憶しておく。
【００２７】
続いて、図７にブート時におけるブート対象プログラム、第１ＭＡＣ値、および第２ＭＡＣ値の記憶状態を示す。ブート時には、演算器１０２が、ブートプログラムを起動し、不揮発性メモリ１０５に記憶されている第１ＭＡＣ値と、ブート対象プログラムとを揮発性メモリ１０４へ移動またはコピーする。続いて、演算器１０２は、機器固有値を元にブート対象プログラムのＭＡＣ値（第２ＭＡＣ値）を算出する。続いて、演算器１０２は、第１ＭＡＣ値と第２ＭＡＣ値とを比較することにより、ＭＡＣ検証を行う。演算器１０２は、ＭＡＣ検証した結果、ブート対象プログラムが正当であり、改ざんされていない場合、ブート対象プログラムをブートする。このように、演算器１０２は、ブート部１４Ａとして機能する。
【００２８】
なお、上述の例では、ブート対象プログラムおよび署名を揮発性メモリ１０４へ移動またはコピーする場合について述べたが、移動またはコピーせずに不揮発性メモリ１０５に記憶したままで署名検証したり、ＭＡＣ検証したりしてもよい。
【００２９】
＜処理フロー＞
続いて、図８に示すフローチャートを用いて、プログラム実行装置１Ａがブート対象プログラムをブートする処理手順を説明する。取得部１１Ａは、プログラム提供装置２Ａから公開鍵を含むブートプログラムを取得し、当該ブートプログラムを記憶する（ステップＳ１１）。続いて、取得部１１Ａは、ブート対象プログラムおよび署名を取得し、当該ブート対象プログラムおよび署名を記憶する（ステップＳ１２）。
【００３０】
署名検証部１２Ａは、取得部１１Ａにより取得されたブートプログラムをブートする前に、取得部１１Ａにより取得された公開鍵と、署名とを用いて署名検証を行う（ステップＳ１３）。
【００３１】
続いて、算出部１３Ａは、署名検証部１２Ａによる署名検証の結果が適切である場合、機器固有値を用いて第１ＭＡＣ値を算出して、当該第１ＭＡＣ値を記憶する（ステップＳ１４）。ここまでが、ブート前の処理である。
【００３２】
続いて、ブート部１４Ａは、ブート対象プログラムのブート時に、再度、機器固有値を用いて第２ＭＡＣ値を算出し、当該第２ＭＡＣ値と、記憶されている第１ＭＡＣ値とを比較してブート対象プログラムが正当であることを判定して（ステップＳ１５）、当該判定結果に基づいてブートを実行する（ステップＳ１６）。
【００３３】
上述のように、取得部１１Ａは、公開鍵と、当該公開鍵に対応する秘密鍵で生成された署名と、当該署名に対応付けられたブート対象プログラムとを取得する。また、署名検証部１２Ａは、取得部１１Ａにより取得されたブート対象プログラムをブートする前に、取得部１１Ａにより取得された公開鍵と、署名とを用いて署名検証を行う。また、算出部１３Ａは、署名検証部１２Ａによる署名検証の結果が適切である場合、機器固有値を用いて、第１ＭＡＣ値を算出して、当該第１ＭＡＣ値を記憶する。ブート部１４Ａは、ブート対象プログラムのブート時に、再度、機器固有値を用いて第２ＭＡＣ値を算出し、当該第２ＭＡＣ値と、記憶されている第１ＭＡＣ値とを比較してブート対象プログラムが正当であり、改善されていないことを判定して、当該判定結果に基づいてブートを実行する。
【００３４】
このように、ブートする前に、署名検証を済ませておき、第１ＭＡＣ値を算出しておくので、ブート時には、第２ＭＡＣ値を算出して、ＭＡＣ検証をすればよい。この結果、プログラム実行装置１Ａは、ブート時に署名検証する場合と比較して、セキュリティレベルを下げることなく、早期にブートすることができる。
【００３５】
ここで、図９を用いて、ブート時に署名検証する場合と、ブート前に予め署名検証しておき、ブート時にＭＡＣ検証する場合の処理時間の比較をする。
【００３６】
図９は、処理時間の比較例を示す図である。図９（ａ）は、上述の方法とは異なり、ブート時に署名検証してブートを行う場合の処理時間を示す。
【００３７】
図９（ａ）に示す処理の前提として、ブート対象プログラムと署名を不揮発性メモリで記憶しているものとする。リセットもしくは電源が投入されたタイミングで、ブート対象プログラムのブートを開始し、ブート対象プログラムと署名とを揮発性メモリへコピーし、揮発性メモリ上のブート対象プログラムに対し署名検証を行い、当該署名検証をした結果、署名が適切である場合、ブートプログラムのブートを継続する。図９（ａ）に示すように、ブート時にハッシュ演算および公開鍵演算をしているため、これらに２．１３Ｍ（メガサイクル）要する。
【００３８】
なお、プログラムのサイズは、１Ｍバイトであり、署名サイズは、２５６バイトである。また、ＳＨＡ２５６を用いてハッシュ演算をしている。
【００３９】
図９（ｂ）および図９（ｃ）は、予め署名検証しておき、ブート時にＭＡＣ検証する場合の処理時間（第１実施形態における処理時間）を示す。
【００４０】
具体的に、図９（ｂ）は、第１実施形態におけるブート前の署名検証およびＭＡＣ値の演算時間を示す。第１実施形態では、ブート前に署名検証を行うので、図９（ａ）の例におけるブート時と同程度の処理時間を要する。なお、図９（ｂ）に示す所定処理は、第１ＭＡＣ値の演算時間などである。
【００４１】
図９（ｃ）は、第１実施形態におけるブート時のＭＡＣ検証の時間を示す。ＭＡＣサイズは１６バイトである。また、公開鍵演算は、出願人が開発したハードウェア暗号ＩＰ（Intellectual Property）を用いている。ＭＡＣ演算は、ＡＥＳ−１２８−ＣＢＣ−ＭＡＣを用いている。
【００４２】
ブート時の処理時間に着目して、図９（ａ）と図９（ｃ）とを比較すると、ブート時に署名処理をする場合と比較して、予めハッシュ演算および公開鍵演算している分、上記実施形態におけるブート時間が短くなっている。すなわち、第１実施形態に係るプログラム実行装置１Ａは、早期にブートすることができる。
【００４３】
＜第２実施形態＞
図１０は、第２実施形態に係るプログラム実行装置１Ｂの構成例について概要を示した図である。プログラム実行装置１Ｂは、プログラム提供装置２Ｂと接続している。第１実施形態では、プログラム提供装置２Ａが、公開鍵を実装するブートプログラムを送信していたが、プログラム提供装置２Ｂは、さらに共通鍵を実装するブートプログラムを送信する。また、第２実施形態では、プログラム提供装置２Ｂが、プログラムと署名とを共通鍵で暗号化したデータをプログラム実行装置１Ｂへ送信する。
【００４４】
取得部１１Ｂは、共通鍵により暗号化されたブート対象プログラムおよび署名を取得すると共に、当該共通鍵を取得する。具体的には、取得部１１Ｂは、プログラム提供装置２Ｂから公開鍵および共通鍵を含むブートプログラムを取得し、当該ブートプログラムを記憶する。また、取得部１１Ｂは、上記共通鍵で暗号化されたブート対象プログラムと当該プログラムの署名とをプログラム提供装置２Ｂから取得し、ブート対象プログラムと署名とを記憶する。
【００４５】
ここで、図１１を用いて、プログラム提供装置２Ｂが、プログラム実行装置１Ｂへ送信するプログラムを生成する手順を説明する。図１１は、プログラム提供装置２Ｂが、プログラム実行装置１Ｂへ送信するプログラムを生成する手順を概念的に説明する図である。
【００４６】
前提として、プログラム提供装置２Ｂは、公開鍵と、当該公開鍵に対応する秘密鍵と、共通鍵とを保持しているものとする。また、プログラム提供装置２Ｂは、ブートプログラムとブート対象プログラムも保持しているものとする。
【００４７】
まず、プログラム提供装置２Ｂは、ブートプログラムに公開鍵を実装させる（ステップＳ２１）。続いて、プログラム提供装置２Ｂは、ブート対象プログラム全体をハッシュ演算した結果に対して秘密鍵を用いた演算をして署名を生成する（ステップＳ２２）。続いて、プログラム提供装置２Ｂは、ブート対象プログラムと署名とを対応付ける処理（連接）をする（ステップＳ２３）。
【００４８】
続いて、プログラム提供装置２Ｂは、上記ブートプログラムに共通鍵を実装させる（ステップＳ２４）。プログラム提供装置２Ｂは、ブート対象プログラムと署名とを共通鍵で暗号化する（ステップＳ２５）。
【００４９】
このように、プログラム提供装置２Ｂは、公開鍵および共通鍵を含むブートプログラムを生成し、ブートプログラムと署名とを対応付けた後、暗号化する。また、プログラム提供装置２Ｂは、当該ブートプログラムをプログラム実行装置１Ｂへ送信すると共に、ブート対象プログラムと署名とを対応付けてプログラム実行装置１Ｂへ送信する。
【００５０】
図１０に戻り、署名検証部１２Ｂは、取得部１１Ｂにより取得された共通鍵を用いてプログラムおよび署名を復号して、公開鍵と復号した署名とを用いて署名検証を行う部分である。具体的に、署名検証部１２Ｂは、ブートする前（例えば、取得部１１Ｂによりブート対象プログラム等が記憶された直後）に、共通鍵を用いてブート対象プログラムおよび署名を復号する。そして、署名検証部１２Ｂは，復号したブート対象プログラム全体をハッシュ演算した結果に対し、公開鍵を用いた演算を行うことにより、署名検証を行う。署名検証を行った後の処理は、署名検証部１２Ａと同様である。
【００５１】
算出部１３Ｂは、署名検証部１２Ｂによる署名検証の結果が適切である場合、機器固有値を用いて第１ＭＡＣ値を算出し、当該機器固有値を用いて鍵（独自鍵）を生成し、当該鍵を用いて第１ＭＡＣ値とブート対象プログラムとを暗号化する。
【００５２】
ブート部１４Ｂは、ブート時に、算出部１３Ｂによって暗号化された第１ＭＡＣ値とブート対象プログラムとを復号し、再度、機器固有値を用いて、復号したブート対象プログラムに対して第２ＭＡＣ値を計算して、ＭＡＣ検証する。
【００５３】
＜ブート対象プログラム等のデータ遷移＞
続いて、図１２〜図１５を用いて、ブートを実行するまでにおける、ブート対象プログラム等のデータ遷移を説明する。まず、図１２にブートプログラム、ブート対象プログラム、および署名を取得した際の記憶状態を示す。演算器１０２は、プログラム提供装置２Ｂからインタフェース部１０６を介して、共通鍵を含むブートプログラム、共通鍵で暗号化したブート対象プログラムおよび署名を取得すると、ブートプログラムをＭａｓｋＲＯＭ１０１に記憶する。また、演算器１０２は、ブート対象プログラムおよび署名を不揮発性メモリ１０５に記憶する。このように、演算器１０２およびインタフェース部１０６は、取得部１１Ｂとして機能する。
【００５４】
続いて、図１３に署名検証およびブート前のＭＡＣ値を算出する際の状態を示す。プログラム実行装置１Ｂは、署名検証時に、ブートプログラムを実行し、不揮発性メモリ１０５に記憶されているブート対象プログラムおよび署名を揮発性メモリ１０４へ移動またはコピーして、ブート対象プログラムおよび署名を共通鍵で復号する。
【００５５】
演算器１０２は、ブートプログラムを実行し、ブート対象プログラム全体をハッシュ演算した結果に対し、公開鍵を用いた演算を行うことにより、署名検証を行う。このように、演算器１０２は、署名検証部１２Ｂとして機能する。この署名検証が適切である場合、機器固有値生成部１０３は、機器固有値を算出し、当該機器固有値を元にブート対象プログラムの第１ＭＡＣ値を算出する。
【００５６】
続いて、図１４にブート前におけるブート対象プログラムおよび第１ＭＡＣ値の記憶状態を示す。演算器１０２が、第１ＭＡＣ値を算出すると、機器固有値による鍵を用いて当該第１ＭＡＣ値とブート対象プログラムとを暗号化する。そして、演算器１０２は、不揮発性メモリ１０５に暗号化した第１ＭＡＣ値とブート対象プログラムとを移動またはコピーすると共に、署名を置き換えて第１ＭＡＣ値を不揮発性メモリ１０５へ移動またはコピーする。このように、プログラム実行装置１Ｂは、ブート実行前に、署名検証を済ませておき、第１ＭＡＣ値を記憶しておく。このように、演算器１０２は、算出部１３Ｂとして機能する。
【００５７】
続いて、図１５にブート時におけるブート対象プログラム、第１ＭＡＣ値、および第２ＭＡＣ値の記憶状態を示す。ブート時には、演算器１０２が、ブートプログラムを起動し、不揮発性メモリ１０５に記憶されている第１ＭＡＣ値と、ブートプログラムとを復号して、揮発性メモリ１０４へ移動またはコピーする。続いて、演算器１０２は、機器固有値を元にブート対象プログラムの第２ＭＡＣ値を算出する。続いて、演算器１０２は、第１ＭＡＣ値と第２ＭＡＣ値とを比較することにより、ＭＡＣ検証を行う。演算器１０２は、ＭＡＣ検証した結果、ブート対象プログラムが正当であり、改ざんされていない場合、ブート対象プログラムをブートする。このように、演算器１０２は、ブート部１４Ｂとして機能する。
【００５８】
なお、上述の例では、ブート対象プログラムおよび署名を揮発性メモリ１０４へ移動またはコピーする場合について述べたが、移動またはコピーせずに不揮発性メモリ１０５に記憶したままで署名検証したり、ＭＡＣ検証したりしてもよい。
【００５９】
＜処理フロー＞
続いて、図１６に示すフローチャートを用いて、プログラム実行装置１Ｂがブート対象プログラムをブートする処理手順を説明する。取得部１１Ｂは、プログラム提供装置２Ｂから公開鍵および共通鍵を含むブートプログラムを取得し、当該ブートプログラムを記憶する（ステップＳ３１）。続いて、取得部１１Ｂは、上記共通鍵で暗号化されたブート対象プログラムおよび署名を取得し、当該ブート対象プログラムおよび署名を記憶する（ステップＳ３２）。署名検証部１２Ｂは、ブート対象プログラムおよび署名を復号する（ステップＳ３３）。
【００６０】
署名検証部１２Ｂは、取得部１１Ｂにより取得されたブート対象プログラムをブートする前に、取得部１１Ｂにより取得された公開鍵と、署名とを用いて署名検証を行う（ステップＳ３４）。
【００６１】
続いて、算出部１３Ｂは、署名検証部１２Ｂによる署名検証の結果が適切である場合、機器固有値を用いて、第１ＭＡＣ値を算出する（ステップＳ３５）。続いて、算出部１３Ｂは、ブート対象プログラムと第１ＭＡＣ値とを機器固有値による鍵を用いて暗号化して（ステップＳ３６）、暗号化したブート対象プログラムと第１ＭＡＣ値とを記憶する。ここまでが、ブート前の処理である。
【００６２】
続いて、ブート部１４Ｂは、ブート対象プログラムのブート時に、再暗号化したブート対象プログラムと第１ＭＡＣ値とを復号し、再度、機器固有値を用いて第２ＭＡＣ値を算出し、ＭＡＣ検証として、第２ＭＡＣ値と、記憶されている第１ＭＡＣ値とを比較してブート対象プログラムが正当であることを判定して（ステップＳ３７）、当該判定結果に基づいてブートを実行する（ステップＳ３８）。
【００６３】
上述のように、取得部１１Ｂは、共通鍵により暗号化されたプログラムおよび署名を取得すると共に、当該共通鍵を取得する。また、署名検証部１２Ｂは、取得部１１Ｂにより取得された共通鍵を用いてプログラムおよび署名を復号して、公開鍵と復号した署名とを用いて署名検証を行う。また、算出部１３Ｂは、機器固有値を用いて鍵を生成し、当該鍵を用いて第１ＭＡＣ値とブート対象プログラムとを暗号化する。ブート部１４Ｂは、ブート対象プログラムおよび第１ＭＡＣ値を復号し、ＭＡＣ検証を行う。
【００６４】
この場合、プログラム実行装置１Ｂは、署名検証やハッシュ検証している時以外、ブート対象プログラムを暗号化した状態を維持するので、より一層ブート対象プログラムをセキュアな状態にすることができる。すなわち、不揮発性メモリ１０５上保存しているブート対象プログラムに実装したアルゴリズム等の情報漏えいを防ぐことができる。
【００６５】
ここで、図１７を用いて、ブート時に署名検証する場合と、予め署名検証しておき、ブート時にＭＡＣ検証する場合の処理時間の比較をする。
【００６６】
図１７は、処理時間の比較例を示す図である。図１７に示す結果は、図９と同一の条件下で処理を行った結果である。図１７（ａ）は、ブート時に署名検証してブートを行う場合の処理時間を示す。図１７（ｂ）および図１７（ｃ）は、予め署名検証しておき、ブート時にＭＡＣ検証する場合における処理時間（第２実施形態による処理の処理時間）を示す。具体的に、図１７（ｂ）は、ブート前の署名検証およびＭＡＣ値の演算時間を示す。図１７（ｃ）は、ブート時のＭＡＣ検証の時間を示す。
【００６７】
ブート時の処理時間に着目して、図１７（ａ）と図１７（ｃ）とを比較すると、図９に示した例と同様に、ブート時に署名する場合と比較して、第２実施形態におけるブート時間が短くなっている。すなわち、第２実施形態に係るプログラム実行装置１Ｂは、早期にブートすることができる。
【００６８】
＜第３実施形態＞
図１８は、第３実施形態に係るプログラム実行装置１Ｃの構成例について概要を示した図である。プログラム実行装置１Ｃは、プログラム提供装置２Ｃと接続している。第３実施形態では、プログラム提供装置２Ｃは、プログラム実行装置１Ｃに送信したブート対象プログラムの一部を修正したプログラム（ブート対象プログラムを提供した事業者などから配信された信頼のある修正プログラム）をプログラム実行装置１Ｃへインターネット等を介して送信する。
【００６９】
プログラム修正部１５は、プログラム提供装置２Ｃから修正プログラムを取得し、プログラムの修正を反映させる部分である。プログラム修正部１５は、プログラム提供装置２Ｃから修正プログラムを受信すると、修正プログラムをブート対象プログラムへ反映させる。プログラム修正部１５は、修正プログラムをブート対象プログラムへ反映させると、プログラムを修正した旨を算出部１３Ｃへ通知する。
【００７０】
なお、プログラム修正部１５は、ブート対象プログラムへの追加プログラムを取得することに応じて、ブート対象プログラムを修正するようにしてもよいし、ブート対象プログラムの一部機能の削除要求を受信して、それに応じて、ブート対象プログラムの一部機能を削除するブート対象プログラムの修正をするようにしてもよい。
【００７１】
算出部１３Ｃは、プログラム修正部１５によりプログラムが修正されると、修正されたプログラムに対する第１ＭＡＣ値を再度算出する部分である。算出部１３Ｃは、プログラム修正部１５からプログラムが修正された旨を受信すると、修正されたプログラムに対して第１ＭＡＣ値を算出して、当該第１ＭＡＣ値を置き換える。
【００７２】
＜修正プログラム等のデータ遷移＞
続いて、図１９および図２０を用いて、ブートを実行するまでの修正プログラム等のデータ遷移を説明する。まず、図１９に修正プログラムを取得した際の記憶状態を示す。前提として、ブート対象プログラム（機能Ａおよび機能Ｂを有するプログラム）に対して、署名検証を済ませており、第１ＭＡＣ値を算出して、当該第１ＭＡＣ値とブート対象プログラムとを不揮発性メモリ１０５に記憶している。この状態において、演算器１０２は、インタフェース部１０６を介してプログラム提供装置２Ｃから修正プログラム（機能Ｂの修正版である機能Ｂ−１のプログラム）を取得すると、当該修正プログラムを揮発性メモリ１０４へ記憶する。このように、演算器１０２およびインタフェース部１０６は、プログラム修正部１５として機能する。
【００７３】
続いて、図２０にブート対象のプログラムと第１ＭＡＣ値の修正をした状態を示す。演算器１０２は、修正プログラムを取得し、記憶すると、ブート対象プログラムおよび第１ＭＡＣ値を揮発性メモリ１０４へ移動またはコピーする。続いて、演算器１０２は、ブート対象プログラムに対して、修正プログラムを反映させる。そして、演算器１０２は、修正したブート対象プログラムに対して、第１ＭＡＣ値を再度算出する。このように、演算器１０２は、算出部１３Ｃとして機能する。続いて、演算器１０２は、再度算出した第１ＭＡＣ値および修正プログラムを反映したブート対象プログラムを不揮発性メモリ１０５へ記憶する。
【００７４】
＜処理フロー＞
続いて、図２１に示すフローチャートを用いて、プログラム実行装置１Ｃが修正プログラムを取得した際に、プログラムの修正を反映して第１ＭＡＣ値を修正する処理手順を説明する。
【００７５】
まず、プログラム修正部１５は、プログラム提供装置２Ｃから修正プログラムを取得し、当該修正プログラムを記憶する（ステップＳ４１）。続いて、プログラム修正部１５は、ブート対象プログラムを修正する（ステップＳ４２）。算出部１３Ｃは、第１ＭＡＣ値を再度算出し（ステップＳ４３）、当該第１ＭＡＣ値を修正する（ステップＳ４４）。
【００７６】
なお、第２実施形態に示したように、ブート対象プログラムおよび第１ＭＡＣ値を暗号化した状態で記憶していた場合も、上述と同様の処理をすることができる。例えば、修正プログラムを取得したとき、まず、プログラム実行装置１Ｃは、機器固有値を用いた独自鍵で、ブート対象プログラムおよび第１ＭＡＣ値を復号する。続いて、プログラム実行装置１Ｃは、ブート対象プログラムに修正プログラムを反映し、第１ＭＡＣ値を再度算出する。続いて、プログラム実行装置１Ｃは、修正したブート対象プログラムおよび第１ＭＡＣ値を独自鍵により暗号化して、記憶すればよい。
【００７７】
上述のように、取得部１１Ｃが修正プログラムを取得すると、プログラム修正部１５が修正プログラムをブート対象プログラムに反映する。これに応じて、算出部１３Ｃが、第１ＭＡＣ値を再度算出（修正）する。
【００７８】
この場合、プログラム実行装置１Ｃは、修正プログラムが反映されたことをトリガーとして、第１ＭＡＣ値を修正するので、プログラムが修正されても適切にＭＡＣ検証を行うことができる。
【００７９】
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は上記の実施の形態に限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能であることはいうまでもない。例えば、上記の実施の形態は本発明を分かりやすく説明するために詳細に説明したものであり、必ずしも説明した全ての構成を備えるものに限定されるものではない。また、上記の各実施の形態の構成の一部について、他の構成の追加・削除・置換をすることが可能である。
【産業上の利用可能性】
【００８０】
本発明は、プログラムをブートする装置に利用可能である。
【符号の説明】
【００８１】
１Ａ、１Ｂ、１Ｃ…プログラム実行装置、２Ａ、２Ｂ、２Ｃ…プログラム提供装置、１１Ａ、１１Ｂ…取得部、１２Ａ、１２Ｂ…署名検証部、１３Ａ、１３Ｂ、１３Ｃ…算出部、１４Ａ、１４Ｂ…ブート部、１５…プログラム修正部、１０１…ＭａｓｋＲＯＭ、１０２…演算器、１０３…機器固有値生成部、１０４…揮発性メモリ、１０５…不揮発性メモリ、１０６…インタフェース部。
【図１】
2018194879.tif 000003
【図２】
2018194879.tif 000004
【図３】
2018194879.tif 000005
【図４】
2018194879.tif 000006
【図５】
2018194879.tif 000007
【図６】
2018194879.tif 000008
【図７】
2018194879.tif 000009
【図８】
2018194879.tif 000010
【図９】
2018194879.tif 000011
【図１０】
2018194879.tif 000012
【図１１】
2018194879.tif 000013
【図１２】
2018194879.tif 000014
【図１３】
2018194879.tif 000015
【図１４】
2018194879.tif 000016
【図１５】
2018194879.tif 000017
【図１６】
2018194879.tif 000018
【図１７】
2018194879.tif 000019
【図１８】
2018194879.tif 000020
【図１９】
2018194879.tif 000021
【図２０】
2018194879.tif 000022
【図２１】
2018194879.tif 000023