サーバ
【課題】固有鍵で暗号化されたプログラムを実行可能なLSIについて、高いセキュリティを保ちつつ、プログラムを更新可能にする。
【解決手段】セキュアLSI1を含むシステムは、サーバ3との通信路を確立し(UD1)、サーバ3から送信された,共有鍵で暗号化された共有鍵暗号化プログラムを受信する(UD6,UD7)。そして、受信した共有鍵暗号化プログラムを復号して平文プログラムを生成し、さらに、平文プログラムを固有鍵で再暗号化し、新たな固有鍵暗号化プログラムとして外部メモリに格納する。
【解決手段】セキュアLSI1を含むシステムは、サーバ3との通信路を確立し(UD1)、サーバ3から送信された,共有鍵で暗号化された共有鍵暗号化プログラムを受信する(UD6,UD7)。そして、受信した共有鍵暗号化プログラムを復号して平文プログラムを生成し、さらに、平文プログラムを固有鍵で再暗号化し、新たな固有鍵暗号化プログラムとして外部メモリに格納する。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、鍵実装されたシステムやこれに用いるLSIにおいて、セキュリティを保ちつつ、プログラムを更新する技術に関する。
【背景技術】
【0002】
従来、LSIを動作させるプログラムを不正な処理から守るために、予め定まったメーカー鍵で暗号化したプログラムをメモリに記憶しておき、復号化して実行することが行われている。しかしながら、このようなシステムでは共通のメーカー鍵で暗号化されたプログラムを実行するLSIが大量にあるため、たとえ1個の製品からでもメーカー鍵の情報が不正に漏洩すると、大量の製品においてプログラムを改ざん可能になってしまい、したがって、セキュリティを高めることができないという課題がある。
【0003】
この課題を解決するために、LSIを動作させるプログラムをLSI毎に固有の固有鍵で暗号化し、製品としては固有鍵で暗号化されたプログラムのみを実行可能とする手法がある(特願2002−215096、特願2002−258481参照)。この手法を用いることにより、1個の製品で鍵情報が不正に漏洩したとしても、その他の製品への影響はないので、セキュリティを高めることができる。また、この手法の前提として、鍵を二重に暗号化する手法がある(特願2001−286881参照。)。
【0004】
なお、ここで挙げた特許出願はいずれも未だ出願公開されておらず、このため、記載すべき先行技術文献情報はない。
【発明の開示】
【発明が解決しようとする課題】
【0005】
一般に、製品となっているLSIに実装されたプログラムのアップデート(更新)は、SSL接続によって通信路を安全に確保し、平文プログラム、またはメーカー鍵で暗号化されたプログラムをサーバからLSIへ送信することによって行われている。しかしながら、この手法では、通信路を不正にアクセスされると、大量の製品で実行可能なプログラムが不正に入手されてしまうので、プログラム更新におけるセキュリティを高めることができない。
【0006】
これを解決するために、上述の手法を用いた場合、LSIは固有鍵で暗号化されたプログラムのみを実行するので、平文プログラムやメーカー鍵で暗号化されたプログラムを送信しても、そのままでは実行することができない。
【0007】
また、LSI毎に異なる鍵で暗号化されたプログラムをサーバ側で準備し、LSI毎に鍵情報を管理した上で、サーバからLSIへ、LSI毎に異なる鍵で暗号化されたプログラムを送信する方法も考えられるが、この方法では、莫大な手間とコストを必要とするため、現実的ではない。
【0008】
前記の問題に鑑み、本発明は、LSI固有の固有鍵で暗号化されたプログラムを実行可能なLSIについて、高いセキュリティを保ちつつ、プログラムを更新するために動作するサーバを提供することを課題とする。
【課題を解決するための手段】
【0009】
前記の課題を解決するために、本発明が講じた解決手段は、LSIを含むシステムにおけるプログラム更新のために動作するサーバとして、前記システムから前記LSIのIDと更新対象プログラムの識別情報であるアプリIDとを受信する第1ステップと、アプリIDとLSIIDとの対応関係を示す第1のテーブルを参照して、前記更新対象プログラムを前記システムに送信するか否かを決定する第2ステップと、前記第2ステップで送信すると決定したとき、前記システムへ、前記更新対象プログラムを共有鍵で暗号化した共有鍵暗号化プログラム、および前記共有鍵の基になる共有鍵情報を送信する第3ステップとを実行するものである。
【0010】
そして、前記本発明に係るサーバにおいて、前記システムから、前記更新対象プログラムの実行に必要なアプリ固有情報を要求する信号を受信する第4ステップと、アプリ固有情報の送信履歴とLSIIDとの対応関係を示す第2のテーブルを参照して、前記第4のステップで要求されたアプリ固有情報を送信するか否かを決定する第5のステップとを実行するのが好ましい。
【0011】
また、前記本発明に係るサーバにおいて、前記共有鍵情報は、平文共有鍵を平文第1中間鍵で暗号化した暗号化共有鍵と、前記平文第1中間鍵を平文第2中間鍵で暗号化した暗号化第1中間鍵とを含むのが好ましい。
【発明の効果】
【0012】
本発明によると、プログラムをLSI毎の固有鍵で再暗号化して実行する秘匿性の高いセキュアLSIにおいても、サーバから同一のプログラムを送信するだけで、プログラムの更新をすること可能となる。
【0013】
また、サーバからセキュアLSIへの通信路が不正にアクセスされて共有鍵暗号化プログラムが盗み出されたとしても、そのプログラムではセキュアLSIを動作させることができないので、秘匿性が向上する。また、万一、暗号を破られた場合でも、被害を受ける製品の数が限定されることになり、従来よりもセキュリティが高まる。
【0014】
さらに、サーバから受信した共有鍵やプログラムの正当性を平文状態のハッシュ値を用いて行うので、通信路における暗号化状態でのハッシュ値で行うよりもハッシュ値の改ざんが行いにくくなり、セキュリティは高まる。
【発明を実施するための最良の形態】
【0015】
以下、本発明の実施の形態について、図面を参照して説明する。なお、以下の説明では、X(鍵またはプログラム)を鍵Yを用いて暗号化して得た、暗号化された鍵またはプログラムのことを、Enc(X,Y)と表すものとする。
【0016】
図1は本実施形態に係る半導体装置としてのセキュアLSIの内部構成を示すブロック図である。図1において、セキュアLSI1は外部バス120を介して、外部メモリ(フラッシュメモリ)100や外部ツール110などと接続可能に構成されている。また、モードIDを与えることによって、その動作モードを設定することが可能になっている。
【0017】
本実施形態に関わる主な構成要素について、簡単に説明する。
【0018】
まず、セキュアLSI1は、書き換え不可領域11を含むセキュアメモリ(セキュアFlash)10を備えている。この書き換え不可領域11には、書き換え不可領域書き込みフラグ12が設けられている。書き換え不可領域書き込みフラグ12は、モードIDが一度セキュアメモリ10に書き込まれると、そのフラグ値が“可”から“済”になり、それ以降の書き換え不可領域への書き込みが不能になる。なお、本実施形態では、セキュアメモリ10および外部メモリ100はフラッシュメモリによって構成されているが、もちろんこれに限定されるものではなく、不揮発性のメモリであればどのようなものであってもかまわない。
【0019】
また、暗号化部2はプログラムの暗号化や復号化を行うものであり、秘密鍵演算処理部20と、鍵生成・更新シーケンサ30とを備えている。秘密鍵演算処理部20は各種の鍵、およびプログラム暗号種を格納するレジスタ(プログラム共有鍵格納レジスタ21、プログラム固有鍵格納レジスタ22、暗号鍵格納レジスタ23等)を備えており、プログラムの暗号化処理又は復号化処理を含む複数のシーケンスを実行可能である。鍵生成・更新シーケンサ30は秘密鍵演算処理部20が実行可能な各シーケンスについて実行の諾否を判断し、実行が許されないと判断したシーケンスについて秘密鍵演算処理部20の動作を禁止する。鍵生成更新シーケンサ30はモードID格納レジスタ31を有しており、このモードID格納レジスタ31に格納されているモードIDに応じて、各シーケンスの実行の諾否を判断する。また、鍵またはプログラムがどのようなアルゴリズムや鍵長で暗号化されているかを示す暗号種別識別子を格納する暗号種別識別子格納レジスタ32、およびプログラム暗号種を記憶する記憶部33を備えている。
【0020】
モードシーケンサ40も、モードID格納レジスタ41を備えており、モードID格納レジスタ41に格納されているモードIDと、ジャンパ43の値に応じて、外部ホストインターフェース(I/F)50の動作、すなわち、外部メモリ100に格納されたプログラムやデータをどのI/Fを介して読み込むか、を制御する。これにより、外部メモリ100に格納された平文プログラムが実行できるか否かを制御することができる。さらに、モードシーケンサ40は、鍵がどの手法によって暗号化されているかを示す暗号種別識別子を格納する暗号種別識別子格納レジスタ42を備えている。
【0021】
外部ホストI/F50は、モードシーケンサ40の制御に従って、プログラム処理部51が有する暗号化用スルー部52、実行用スルー部53およびプログラム復号用暗号エンジン54、並びに、データ処理部55が有するスルー部56およびコンテンツ暗号・復号用暗号エンジン57のうちのいずれかを介して、外部メモリ100や外部ツール110との間でプログラムやデータの入出力を行う。またプログラム復号用暗号エンジン54は、プログラムの復号に用いるプログラム固有鍵を格納するためのプログラム固有鍵可能レジスタ58を備えている。
【0022】
ここで、後述する鍵生成モードと商品動作モードにおいては、実行用スルー部53を介してプログラムを取り込むことが出来ないように構成されている。すなわち、セキュアLSI1は後述する鍵生成モードと商品動作モードにおいては、固有鍵で暗号化されたプログラム以外へは動作を遷移しないように構成されている。
【0023】
ブートROM60は、セキュアLSI1の起動動作を制御するブートプログラムを格納している。HASH演算部70は、セキュアLSI1に読み込まれたプログラムについてその正当性を検証するために、HASH値を演算する。
【0024】
また、外部メモリ100には、プログラムやコンテンツが格納されている。外部ツール110には、セキュアLSI1の最初の起動時にセキュアメモリ10に格納する各種の初期値が格納されている。この初期値の種類は、設定される動作モードに応じて、異なったものになる。
【0025】
図2は図1のセキュアLSI1を用いた開発および製品化の全体の流れを表す図である。図2に示すように、セキュアLSI1は、アドミニストレータモード(モードID:00)、鍵生成モード(モードID:01)、開発モード(モードID:10)および商品動作モード(モードID:11)の4種類の動作モードで、動作する。
【0026】
まず、アドミニストレータモードに設定されたセキュアLSI1は、管理者用LSIとして、動作する。管理者用LSIでは、鍵生成プログラムが開発され(PA1)、また、その鍵生成プログラムが任意の鍵生成鍵を用いて暗号化される(PA2)。
【0027】
鍵生成モードに設定されたセキュアLSI1は、鍵生成用LSIとして、動作する。鍵生成用LSIでは、管理者用LSIにおいて生成された、暗号化された鍵生成プログラムが実装され(PB1)、この鍵生成プログラムを実行することによって、各種の鍵が生成される(PB2)。
【0028】
開発モードに設定されたセキュアLSI1は、開発用LSIとして、動作する。開発用LSIでは、実際の製品で実行されるアプリケーション用プログラムが開発される(PC1)。そして、このアプリケーション用プログラムが、プログラム共有鍵を用いて暗号化される(PC2)。
【0029】
商品動作モードに設定されたセキュアLSI1は、実際の商品LSIとして、動作する。商品LSIでは、開発用LSIにおいて生成された、プログラム共有鍵で暗号化されたアプリケーション用プログラムが実装され、その内部で、プログラム固有鍵で暗号化されたアプリケーション用プログラムに、変換される(PD1)。その後、通常の商品LSIとして動作する(PD2)。なお、この変換処理は、開発用LSIでも、アプリケーション用プログラムのデバッグのために、実行可能になっている(PC3)。
【0030】
以下、上記のように構成されたセキュアLSI1の商品動作モードにおける通常動作およびセキュアアップデート動作の詳細について、フローチャートおよびデータフローを参照して、説明する。
【0031】
図3はブートプログラムの全体的な処理の流れを示すフローチャートである。セキュアLSI1に電源が投入されると、ブートROM60に格納されたブートプログラムがCPU65によって実行される。図3に示すように、まず、各ハードウェアを初期化する(SZ0)。そして、外部ツール110からさまざまな初期値を読み込み、セキュアメモリ10に設定する(SZ1)。
【0032】
図4は初期値設定処理SZ1のフローチャートである。まず、ジャンパ44で、セキュアメモリ10がLSI内に実装されているか否かの判定を行う(SZ11)。次に、書き換え不可領域書き込みフラグ12が“済”であるか否かを判定し(SZ12)、“済”であるときは(Yes)すでにセキュアメモリ10に初期値が設定されているので、処理SZ1を終了する。書き換え不可領域書き込みフラグ12が“可”であるときは(No)、セキュアメモリ10に初期値を書き込んでいく(SZ13〜SZ18)。モードIDに加えて、暗号化されたプログラム固有鍵、アドレス管理情報、データ固有鍵をセキュアメモリ10の書き換え不可領域11に書き込む。なお、最初の判定の結果、セキュアメモリ10がLSIの外部にあると判定されたときは(SZ14でNo)、モードIDは商品動作モードを表す値に上書きされる(SZ15)。これにより、セキュアメモリ10がLSIパッケージ外にあるような不正な製品は、商品動作モードでしか動作できない。
【0033】
次に、書き込み不可領域書き込みフラグ12を“済”にセットする(SZ19)。これによって、以後の書き換え不可領域11の書き換えはできなくなる。さらに、通常領域13,14に暗号種別識別子および実装モードフラグを書き込む(SZ1A)。そして、モードIDがアドミニストレータモード以外のモードを示すときは(SZ1BでNo)、これらに加えて、暗号化された共有鍵/鍵生成鍵も通常領域13,14に書き込む(SZ1C)。
【0034】
その後、前処理SZ2を実行する。ここでは、セキュアメモリ10の書き込み不可領域11に設定されたモードIDが、鍵生成・更新シーケンサ30のモードID格納レジスタ31と、モードシーケンサ40のモードID格納レジスタ41とに設定される。また、セキュアメモリ10の第1の通常領域13に設定された暗号種別識別子が、鍵生成・更新シーケンサ30の暗号種別識別子格納レジスタ32と、モードシーケンサ40の暗号種別識別子格納レジスタ42とに設定される。さらに、セキュアメモリ10の書き換え不可領域11に格納されたアドレス管理情報が、MEMC80の暗号アドレス区分格納レジスタ81に設定される。ここまでの動作は、図2における初期値設定フェーズPA0,PB0,PC0,PD0に対応している。
【0035】
その後は、モードIDの値に応じて、それぞれのモードにおける動作を行う(SZ3)。このようにモードIDの値に応じて、セキュアLSIで行う動作を制限することによりプログラムの秘匿性を高めている。
【0036】
次に通常の商品動作(通常ブート処理)について詳細に説明する。
【0037】
モードIDが「11」のとき、セキュアLSI1は商品動作モードになり、実装モードフラグの値に応じて(SD0)、プログラム実装処理SD1、または通常ブート処理SD2を実行する。
【0038】
図5はプログラム実装処理SD1のフローチャート、図6、7はデータフローである。プログラム実装処理SD1においては、セキュアメモリ10に格納された固有鍵情報を用いてプログラム固有鍵を(SD11、SD12)、共有鍵情報を用いてプログラム共有鍵を復号し(SD13、SD14)、復号されたプログラム共有鍵とプログラム固有鍵を用いて外部メモリ100に格納されたプログラムEnc(プログラム、プログラム共有鍵)をEnc(プログラム、プログラム固有鍵)へと変換する(SD15−SD17)。その後、プログラムの正当性の検証を行い(SD18)、正当であるならば実装モードフラグをOFFに設定する(SD19)。これにより次回の起動時からはプログラム実装処理SD1は行われない。そして最後にセキュアメモリ10に格納されたプログラム共有鍵と、外部メモリ100に格納されたプログラムEnc(プログラム、プログラム共有鍵)は削除される(SD1A、SD1B)。
【0039】
図8は通常ブート処理SD2のフローチャート、図9、10はデータフローである。通常ブート処理SD2においては、まず、内部メモリとしてのセキュアメモリ10の書き込み不可領域11に格納された、固有鍵鍵情報としての暗号化されたプログラム固有鍵、すなわち、暗号化固有鍵Enc(プログラム固有鍵(平文)、MK0(平文第3中間鍵))および暗号化第2中間鍵Enc(MK0,CK0(平文第4中間鍵))を秘密鍵演算処理部20の暗号鍵格納レジスタに設定する(SD21)。そして、この暗号化されたプログラム固有鍵を、鍵生成・更新シーケンサ30に実装されたプログラム暗号種を用いて復号し、プログラム固有鍵を得る(SD22)。得られたプログラム固有鍵は秘密鍵演算処理部20のプログラム固有鍵格納レジスタ22と、外部ホストI/F50のプログラム復号用暗号エンジン54のプログラム固有鍵格納レジスタ58に設定する(SD23)。
【0040】
その後、セキュアメモリ10の書き込み不可領域11に格納されているデータ固有IDを秘密鍵演算処理部20の固有ID格納レジスタに設定する(SD24)。また、CPU65によって乱数を生成し、秘密鍵演算処理部20の乱数格納レジスタに設定する(SD25)。そして、秘密鍵演算処理部20によって、データ固有IDと乱数からデータ固有鍵を生成する(SD26)。コンテンツの再生にはデータ固有鍵を用いて行う。データ固有鍵は乱数を用いて生成されるため、起動毎に異なることとなり、コンテンツ再生の安全性が高まる。
【0041】
その後、外部メモリ100に格納されていた,プログラム固有鍵で暗号化されたプログラムEnc(プログラム,プログラム固有鍵)を、外部ホストI/F50が有するプログラム処理部51のプログラム復号用暗号エンジン54を介して復号し、HASH演算部70に取り込み、HASH値を演算する(SD27)。復号に用いられる鍵としては外部ホストI/Fのプログラム固有鍵格納レジスタ58に格納されたプログラム固有鍵が用いられる。そして、この演算したHASH値と、セキュアメモリ10の通常領域13に格納されていたHASH値とを比較し、プログラムが改ざんされていないかどうかをチェックする(SD28)。HASH値が一致していたとき(SD29でNo)、外部メモリ100に格納されていたプログラムEnc(プログラム,プログラム固有鍵)に処理を遷移し、アプリケーションを実行する(SD2A)。一方、HASH値が一致していないとき(SD29でYes)は、何らかの不正が行われたものと推定して、不正アクセス時制御による処理を実行する(SD2B)。
【0042】
ここで、上述のように商品として動作するセキュアLSIについて、プログラムの更新を行う処理について、図面を参照しながら説明する。図11はプログラム更新の際に、サーバ3とセキュアLSI1を含むシステムとの間におけるデータのやり取りを示すフローである。
【0043】
図11に示すように、まず、セキュアLSI1がプログラム更新処理を起動すると、サーバ3はシステムからセキュアLSI1のIDを受信してID認証を行い、認証した場合は、セキュアLSI1とSSL接続する(UD1)。これにより、サーバ3とセキュアLSI1を含むシステムとの間の通信路の安全性が一応確保される。
【0044】
通信路が確保されると、システムは、更新対象プログラムの識別情報であるアプリIDをサーバ3へ送信する(UD2)。サーバ3は、更新可能なプログラムのアプリIDと、プログラムを動作させて良いLSIのIDとの対応関係を示す第1のテーブル4を管理しており、この第1のテーブル4に基づいて、プログラムを送信してよいか否かを判断する。セキュアLSI1のIDと、更新を要求されたプログラムのアプリIDとの対応が確認されると、サーバ3は、この更新対象プログラムの送信を開始する。
【0045】
まず、サーバ3から、更新対象プログラムの付加情報をセキュアLSI1へ送信する(UD3)。ここでの付加情報は、セキュアLSI1側でプログラムを更新してよいか否かを認証させるための署名、更新対象プログラムのサイズ、および、更新対象プログラムのハッシュ値(平文での値)等を含む。セキュアLSI1は、付加情報として送信された署名を用いて認証を行い、また、送信されたプログラムサイズを基にして、外部メモリ100に更新可能な空き領域があるか否かを判断する。そして、更新が可能であると判断した場合は、サーバ3に対して、共有鍵情報を送信するよう要求する(UD4)。
【0046】
サーバ3は、要求を受信すると、共有鍵情報として、暗号化共有鍵Enc(プログラム共有鍵(平文),MK1(平文第1中間鍵))および暗号化第1中間鍵Enc(MK1,CK1(平文第2中間鍵))をセキュアLSI1へ送信する(UD5)。セキュアLSI1は、共有鍵情報を用いてプログラム共有鍵を復号し、復号された状態でハッシュ演算を行い、正当性の検証をする。プログラム共有鍵を正常に復号すると、システムはサーバ3に対して、共有鍵暗号化プログラムを送信するよう要求する(UD6)。サーバ3は、要求を受信すると、プログラムEnc(プログラム、プログラム共有鍵)をシステムへ送信する(UD7)。セキュアLSI1は、Enc(プログラム、プログラム共有鍵)をEnc(プログラム、プログラム固有鍵)へと変換する。さらに、変換されたEnc(プログラム、プログラム固有鍵)を平文プログラムに復号し、ハッシュ演算して、先に付加情報として受信したハッシュ値との比較によって、正当性を検証する。ここでの処理については、後で詳細に説明する。
【0047】
共有鍵暗号化プログラムが固有鍵暗号化プログラムに正常に変換できたとき、セキュアLSI1を含むシステムはサーバ3へ、アプリ固有情報を送信するよう要求する(UD8)。アプリ固有情報はプログラムの実行に必要な情報を含んでおり、アプリ固有情報がないと、セキュアLSI1は更新したプログラムを実行できない。サーバ3は、アプリ固有情報の送信履歴とLSIのIDとの対応関係を示す第2のテーブル5も管理しており、同一のセキュアLSIには複数のアプリ固有情報を送信しないようにする。よって、同一のセキュアLSIは複数回、同一のプログラムを更新することができない。
【0048】
サーバ3は、アプリ固有情報を送信してよいと判断したとき、アプリ固有情報をセキュアLSI1を含むシステムへ送信し(UD9)、セキュアLSI1がこれをハッシュ演算して正当性を検証すると、プログラム更新が終了し、通信は切断される(UD10)。
【0049】
なお、本発明におけるサーバ3とセキュアLSIを含むシステムとの間におけるデータのやり取りは上述のフローに限定されるものではない。例えば、サーバ3は、必ずしも、第2のテーブルを管理し、同一のセキュアLSIに複数のアプリ固有情報を送信しないようにする必要はない。しかしながら、同一のセキュアLSIに複数回、同一のプログラムを送信しないようにすることにより、プログラムの秘匿性はより高まる。
【0050】
また、付加情報、共有鍵情報、共有鍵暗号化プログラムは、必ずしも、サーバ3からセキュアLSIへと別々に送信する必要はなく、その一部、または全部をまとめたプログラムパッケージとして一度に送信してもよい。
【0051】
セキュアLSI1における、共有鍵暗号化プログラムEnc(プログラム、プログラム共有鍵)から固有鍵暗号化プログラムEnc(プログラム、プログラム固有鍵)への変換について、図面を参照しながら詳述する。図12は外部メモリ100に格納された、プログラム更新に係わるプログラムの構成を示す図である。
【0052】
図12に示すように、外部メモリ100には、固有鍵でそれぞれ暗号化された、暗号化制御プログラム200(Enc(制御プログラム、プログラム固有鍵))、および暗号化アプリケーションプログラム210(Enc(アプリケーションプログラム、プログラム固有鍵))が格納されている。
【0053】
暗号化制御プログラム200はアプリケーション起動部201およびプログラム更新制御部205を備え、プログラム更新制御部205は共有鍵復号部206、プログラム固有鍵暗号化処理部207およびプログラム更新成否判定部208を備えている。
【0054】
アプリケーション起動部201はブートROM60に格納されたブートプログラムからの指示を受けて、暗号化アプリケーションプログラム210を起動する。共有鍵復号部206はサーバ3から送信された共有鍵情報を基にして、鍵生成・更新シーケンサ30を用いて、プログラム共有鍵を復号する。プログラム固有鍵暗号化処理部207は鍵生成・更新シーケンサ30を用いて、共有鍵暗号化プログラムEnc(プログラム、プログラム共有鍵)から固有鍵暗号化プログラムEnc(プログラム、プログラム固有鍵)への変換を行う。プログラム更新成否判定部208は、固有鍵暗号化プログラムEnc(プログラム、プログラム固有鍵)を平文プログラムに復号し、ハッシュ検証によってプログラム更新の成否を判定する。そして、プログラム更新が成功したときは、古いプログラムを削除し、プログラム格納先・サイズなどの情報をセキュアメモリ10に格納する。
【0055】
暗号化アプリケーションプログラム210は、通常のアプリケーションプログラムである通常動作部211の他、サーバや記録媒体から新しいアプリケーションプログラムを取得するためのプログラム取得部212もアプリケーションプログラムとして備えている。プログラムの更新は、これらのような外部メモリ100に格納されたプログラムを用いて行われる。
【0056】
図13は共有鍵暗号化プログラムから固有鍵暗号化プログラムへの変換処理を含む、プログラム更新処理を示すフローチャートである。
【0057】
アプリケーションプログラムの実行中(SX1)に、ユーザの操作等の外部要因によってプログラムの更新が要求されると、システムはこれを検知し、プログラム更新を開始するために、通常動作部211が暗号化アプリケーションプログラム210の取得プログラムとしてのプログラム取得部212を起動する(SX2)。
【0058】
プログラム取得部212はサーバ3と通信して、認証や、共有鍵情報・プログラムの取得を行う(SX3)。サーバ3から共有鍵情報を取得すると、共有鍵復号部206はプログラム共有鍵を復号する(SX4,SX5)。すなわち、共有鍵鍵情報としての暗号化されたプログラム共有鍵Enc(プログラム共有鍵,MK2)、Enc(MK2,CK)を秘密鍵演算処理部20の暗号鍵格納レジスタ23に設定し、この暗号化されたプログラム共有鍵を、鍵生成・更新シーケンサ30に実装されたプログラム暗号種を用いて復号し、プログラム共有鍵を得る。得られたプログラム共有鍵は秘密鍵演算処理部20のプログラム共有鍵格納レジスタ21に格納される。
【0059】
次に、プログラム固有鍵暗号化処理部207が、共有鍵暗号化プログラムから固有鍵暗号化プログラムへの変換を行う。すなわち、サーバ3から送信され外部メモリ100に格納されていたプログラムEnc(プログラム,プログラム共有鍵)を、外部ホストI/F50が有するプログラム処理部51の暗号化用スルー部52を介して、秘密鍵演算処理部20に取り込む(SX6)。そして、取り込んだプログラムを、プログラム共有鍵格納レジスタ21に格納されたプログラム共有鍵で復号した後、プログラム固有鍵格納レジスタ22に格納されたプログラム固有鍵で暗号化し、プログラムEnc(プログラム,プログラム固有鍵)を得る。なお、上述したように、プログラム固有鍵はシステムの起動時にすでに復号されており、秘密鍵演算処理部20のプログラム固有鍵格納レジスタ22に格納されている。
【0060】
最後に、プログラム更新成否判定部208が、プログラム更新の成否を判定する。すなわち、Enc(プログラム,プログラム固有鍵)を外部メモリ100に書き込んだ(SX8)後、外部ホストI/F50が有するプログラム処理部51のプログラム復号用暗号エンジン53を用いて、復号して取り込み(SX9)、平文状態でのハッシュ値を演算する(SX10)。演算されたハッシュ値は、プログラム取得部212が暗号化プログラムとともに取得したハッシュ値と比較され、この比較によって更新の成否が判定される(SX11)。更新が成功したときは、古いプログラムを消去する(SX12)一方、更新が失敗したときは、送信されたプログラムを消去する(SX13)。そしてプログラム格納先、サイズなどの情報をセキュアメモリ10に書き込み(SX14)、更新処理が終了する。
【0061】
上述のプログラム更新方法を用いることによって、サーバからプログラム共有鍵暗号化プログラムを送信すると、セキュアLSIにおいて、暗号化する鍵がプログラム共有鍵からプログラム固有鍵に変換されて、システムに実装される。このため、たとえサーバからセキュアLSIへの通信路が不正にアクセスされプログラム共有鍵暗号化プログラムが盗み出されたとしても、このプログラムによってセキュアLSIを動作させることは、できない。また更新の結果、ユーザの持つ各製品では、互いに異なる固有鍵によって暗号化されたプログラムが実装されることになり、秘匿性が向上する。また、万一、暗号を破られた場合でも、被害を受ける製品の数が限定されることになり、従来よりもセキュリティが高まる。
【0062】
なお、本実施形態において、共有鍵情報をサーバから取得しているが、これは、商品動作モード「11」におけるプログラム実装(SD1)の最後において、復号されたプログラム共有鍵およびセキュアメモリ10上の共有鍵情報を削除しているためであり、これらを削除しない場合は、共有鍵情報はサーバから取得する必要はなく、セキュアメモリ10から読み出して復号すればよい。
【0063】
また、本実施形態では、外部要因によってプログラムの更新の開始が指示され、通常瞳サブ211がプログラム取得部212を起動し、プログラムの取得後はブートプログラムによって各処理を指示するものとしたが、本発明はこれに限られるものではない。例えば、ブートプログラムがプログラム取得部212を起動する構成にすることによって、さらにセキュリティを高めることができる。
【0064】
また、プログラム固有鍵は必ずしも製品毎に固有である必要はなく、品種ごとまたは複数個毎に同一であっても良い。1個の製品において暗号を破られたときに被害を少なくするのが本願発明のねらいであり、同一の鍵で暗号化されたプログラムを有するLSIの数を少しでも減らすだけで効果は充分に発揮できる。さらに言えば、プログラム固有鍵は全て共通であったとしても、通信路が破られ共有鍵暗号化プログラムが盗み出されたとしてもそのままではセキュアLSIで動作できないので、鍵を共有鍵から固有鍵に書き換えるだけでも、効果は発揮できる。
【図面の簡単な説明】
【0065】
【図1】本発明の実施形態に係るセキュアLSIの構成を示すブロック図である。
【図2】図1のセキュアLSIを用いた開発および製品化の全体の流れを表す図である。
【図3】ブートプログラムの全体的な処理の流れを示すフローチャートである。
【図4】セキュアメモリ初期値設定SZ1のデータフローである。
【図5】商品動作モードにおけるプログラム実装処理SD1のフローチャートである。
【図6】プログラム実装処理SD1のデータフロー1である。
【図7】プログラム実装処理SD1のデータフロー2である。
【図8】商品動作モードにおける通常ブート処理SD2のフローチャートである。
【図9】通常ブート処理SD2のデータフロー1である。
【図10】通常ブート処理SD2のデータフロー1である。
【図11】プログラム更新におけるサーバとの通信を示すフローチャートである。
【図12】外部メモリ100に格納された,プログラム更新に係わるプログラムの構成を示す図である。
【図13】プログラムの更新処理を示すフローチャートである。
【符号の説明】
【0066】
1 セキュアLSI
3 サーバ
4 第1のテーブル
5 第2のテーブル
10 セキュアメモリ(内部メモリ)
58 プログラム固有鍵格納レジスタ
60 ブートROM
100 外部メモリ
【技術分野】
【0001】
本発明は、鍵実装されたシステムやこれに用いるLSIにおいて、セキュリティを保ちつつ、プログラムを更新する技術に関する。
【背景技術】
【0002】
従来、LSIを動作させるプログラムを不正な処理から守るために、予め定まったメーカー鍵で暗号化したプログラムをメモリに記憶しておき、復号化して実行することが行われている。しかしながら、このようなシステムでは共通のメーカー鍵で暗号化されたプログラムを実行するLSIが大量にあるため、たとえ1個の製品からでもメーカー鍵の情報が不正に漏洩すると、大量の製品においてプログラムを改ざん可能になってしまい、したがって、セキュリティを高めることができないという課題がある。
【0003】
この課題を解決するために、LSIを動作させるプログラムをLSI毎に固有の固有鍵で暗号化し、製品としては固有鍵で暗号化されたプログラムのみを実行可能とする手法がある(特願2002−215096、特願2002−258481参照)。この手法を用いることにより、1個の製品で鍵情報が不正に漏洩したとしても、その他の製品への影響はないので、セキュリティを高めることができる。また、この手法の前提として、鍵を二重に暗号化する手法がある(特願2001−286881参照。)。
【0004】
なお、ここで挙げた特許出願はいずれも未だ出願公開されておらず、このため、記載すべき先行技術文献情報はない。
【発明の開示】
【発明が解決しようとする課題】
【0005】
一般に、製品となっているLSIに実装されたプログラムのアップデート(更新)は、SSL接続によって通信路を安全に確保し、平文プログラム、またはメーカー鍵で暗号化されたプログラムをサーバからLSIへ送信することによって行われている。しかしながら、この手法では、通信路を不正にアクセスされると、大量の製品で実行可能なプログラムが不正に入手されてしまうので、プログラム更新におけるセキュリティを高めることができない。
【0006】
これを解決するために、上述の手法を用いた場合、LSIは固有鍵で暗号化されたプログラムのみを実行するので、平文プログラムやメーカー鍵で暗号化されたプログラムを送信しても、そのままでは実行することができない。
【0007】
また、LSI毎に異なる鍵で暗号化されたプログラムをサーバ側で準備し、LSI毎に鍵情報を管理した上で、サーバからLSIへ、LSI毎に異なる鍵で暗号化されたプログラムを送信する方法も考えられるが、この方法では、莫大な手間とコストを必要とするため、現実的ではない。
【0008】
前記の問題に鑑み、本発明は、LSI固有の固有鍵で暗号化されたプログラムを実行可能なLSIについて、高いセキュリティを保ちつつ、プログラムを更新するために動作するサーバを提供することを課題とする。
【課題を解決するための手段】
【0009】
前記の課題を解決するために、本発明が講じた解決手段は、LSIを含むシステムにおけるプログラム更新のために動作するサーバとして、前記システムから前記LSIのIDと更新対象プログラムの識別情報であるアプリIDとを受信する第1ステップと、アプリIDとLSIIDとの対応関係を示す第1のテーブルを参照して、前記更新対象プログラムを前記システムに送信するか否かを決定する第2ステップと、前記第2ステップで送信すると決定したとき、前記システムへ、前記更新対象プログラムを共有鍵で暗号化した共有鍵暗号化プログラム、および前記共有鍵の基になる共有鍵情報を送信する第3ステップとを実行するものである。
【0010】
そして、前記本発明に係るサーバにおいて、前記システムから、前記更新対象プログラムの実行に必要なアプリ固有情報を要求する信号を受信する第4ステップと、アプリ固有情報の送信履歴とLSIIDとの対応関係を示す第2のテーブルを参照して、前記第4のステップで要求されたアプリ固有情報を送信するか否かを決定する第5のステップとを実行するのが好ましい。
【0011】
また、前記本発明に係るサーバにおいて、前記共有鍵情報は、平文共有鍵を平文第1中間鍵で暗号化した暗号化共有鍵と、前記平文第1中間鍵を平文第2中間鍵で暗号化した暗号化第1中間鍵とを含むのが好ましい。
【発明の効果】
【0012】
本発明によると、プログラムをLSI毎の固有鍵で再暗号化して実行する秘匿性の高いセキュアLSIにおいても、サーバから同一のプログラムを送信するだけで、プログラムの更新をすること可能となる。
【0013】
また、サーバからセキュアLSIへの通信路が不正にアクセスされて共有鍵暗号化プログラムが盗み出されたとしても、そのプログラムではセキュアLSIを動作させることができないので、秘匿性が向上する。また、万一、暗号を破られた場合でも、被害を受ける製品の数が限定されることになり、従来よりもセキュリティが高まる。
【0014】
さらに、サーバから受信した共有鍵やプログラムの正当性を平文状態のハッシュ値を用いて行うので、通信路における暗号化状態でのハッシュ値で行うよりもハッシュ値の改ざんが行いにくくなり、セキュリティは高まる。
【発明を実施するための最良の形態】
【0015】
以下、本発明の実施の形態について、図面を参照して説明する。なお、以下の説明では、X(鍵またはプログラム)を鍵Yを用いて暗号化して得た、暗号化された鍵またはプログラムのことを、Enc(X,Y)と表すものとする。
【0016】
図1は本実施形態に係る半導体装置としてのセキュアLSIの内部構成を示すブロック図である。図1において、セキュアLSI1は外部バス120を介して、外部メモリ(フラッシュメモリ)100や外部ツール110などと接続可能に構成されている。また、モードIDを与えることによって、その動作モードを設定することが可能になっている。
【0017】
本実施形態に関わる主な構成要素について、簡単に説明する。
【0018】
まず、セキュアLSI1は、書き換え不可領域11を含むセキュアメモリ(セキュアFlash)10を備えている。この書き換え不可領域11には、書き換え不可領域書き込みフラグ12が設けられている。書き換え不可領域書き込みフラグ12は、モードIDが一度セキュアメモリ10に書き込まれると、そのフラグ値が“可”から“済”になり、それ以降の書き換え不可領域への書き込みが不能になる。なお、本実施形態では、セキュアメモリ10および外部メモリ100はフラッシュメモリによって構成されているが、もちろんこれに限定されるものではなく、不揮発性のメモリであればどのようなものであってもかまわない。
【0019】
また、暗号化部2はプログラムの暗号化や復号化を行うものであり、秘密鍵演算処理部20と、鍵生成・更新シーケンサ30とを備えている。秘密鍵演算処理部20は各種の鍵、およびプログラム暗号種を格納するレジスタ(プログラム共有鍵格納レジスタ21、プログラム固有鍵格納レジスタ22、暗号鍵格納レジスタ23等)を備えており、プログラムの暗号化処理又は復号化処理を含む複数のシーケンスを実行可能である。鍵生成・更新シーケンサ30は秘密鍵演算処理部20が実行可能な各シーケンスについて実行の諾否を判断し、実行が許されないと判断したシーケンスについて秘密鍵演算処理部20の動作を禁止する。鍵生成更新シーケンサ30はモードID格納レジスタ31を有しており、このモードID格納レジスタ31に格納されているモードIDに応じて、各シーケンスの実行の諾否を判断する。また、鍵またはプログラムがどのようなアルゴリズムや鍵長で暗号化されているかを示す暗号種別識別子を格納する暗号種別識別子格納レジスタ32、およびプログラム暗号種を記憶する記憶部33を備えている。
【0020】
モードシーケンサ40も、モードID格納レジスタ41を備えており、モードID格納レジスタ41に格納されているモードIDと、ジャンパ43の値に応じて、外部ホストインターフェース(I/F)50の動作、すなわち、外部メモリ100に格納されたプログラムやデータをどのI/Fを介して読み込むか、を制御する。これにより、外部メモリ100に格納された平文プログラムが実行できるか否かを制御することができる。さらに、モードシーケンサ40は、鍵がどの手法によって暗号化されているかを示す暗号種別識別子を格納する暗号種別識別子格納レジスタ42を備えている。
【0021】
外部ホストI/F50は、モードシーケンサ40の制御に従って、プログラム処理部51が有する暗号化用スルー部52、実行用スルー部53およびプログラム復号用暗号エンジン54、並びに、データ処理部55が有するスルー部56およびコンテンツ暗号・復号用暗号エンジン57のうちのいずれかを介して、外部メモリ100や外部ツール110との間でプログラムやデータの入出力を行う。またプログラム復号用暗号エンジン54は、プログラムの復号に用いるプログラム固有鍵を格納するためのプログラム固有鍵可能レジスタ58を備えている。
【0022】
ここで、後述する鍵生成モードと商品動作モードにおいては、実行用スルー部53を介してプログラムを取り込むことが出来ないように構成されている。すなわち、セキュアLSI1は後述する鍵生成モードと商品動作モードにおいては、固有鍵で暗号化されたプログラム以外へは動作を遷移しないように構成されている。
【0023】
ブートROM60は、セキュアLSI1の起動動作を制御するブートプログラムを格納している。HASH演算部70は、セキュアLSI1に読み込まれたプログラムについてその正当性を検証するために、HASH値を演算する。
【0024】
また、外部メモリ100には、プログラムやコンテンツが格納されている。外部ツール110には、セキュアLSI1の最初の起動時にセキュアメモリ10に格納する各種の初期値が格納されている。この初期値の種類は、設定される動作モードに応じて、異なったものになる。
【0025】
図2は図1のセキュアLSI1を用いた開発および製品化の全体の流れを表す図である。図2に示すように、セキュアLSI1は、アドミニストレータモード(モードID:00)、鍵生成モード(モードID:01)、開発モード(モードID:10)および商品動作モード(モードID:11)の4種類の動作モードで、動作する。
【0026】
まず、アドミニストレータモードに設定されたセキュアLSI1は、管理者用LSIとして、動作する。管理者用LSIでは、鍵生成プログラムが開発され(PA1)、また、その鍵生成プログラムが任意の鍵生成鍵を用いて暗号化される(PA2)。
【0027】
鍵生成モードに設定されたセキュアLSI1は、鍵生成用LSIとして、動作する。鍵生成用LSIでは、管理者用LSIにおいて生成された、暗号化された鍵生成プログラムが実装され(PB1)、この鍵生成プログラムを実行することによって、各種の鍵が生成される(PB2)。
【0028】
開発モードに設定されたセキュアLSI1は、開発用LSIとして、動作する。開発用LSIでは、実際の製品で実行されるアプリケーション用プログラムが開発される(PC1)。そして、このアプリケーション用プログラムが、プログラム共有鍵を用いて暗号化される(PC2)。
【0029】
商品動作モードに設定されたセキュアLSI1は、実際の商品LSIとして、動作する。商品LSIでは、開発用LSIにおいて生成された、プログラム共有鍵で暗号化されたアプリケーション用プログラムが実装され、その内部で、プログラム固有鍵で暗号化されたアプリケーション用プログラムに、変換される(PD1)。その後、通常の商品LSIとして動作する(PD2)。なお、この変換処理は、開発用LSIでも、アプリケーション用プログラムのデバッグのために、実行可能になっている(PC3)。
【0030】
以下、上記のように構成されたセキュアLSI1の商品動作モードにおける通常動作およびセキュアアップデート動作の詳細について、フローチャートおよびデータフローを参照して、説明する。
【0031】
図3はブートプログラムの全体的な処理の流れを示すフローチャートである。セキュアLSI1に電源が投入されると、ブートROM60に格納されたブートプログラムがCPU65によって実行される。図3に示すように、まず、各ハードウェアを初期化する(SZ0)。そして、外部ツール110からさまざまな初期値を読み込み、セキュアメモリ10に設定する(SZ1)。
【0032】
図4は初期値設定処理SZ1のフローチャートである。まず、ジャンパ44で、セキュアメモリ10がLSI内に実装されているか否かの判定を行う(SZ11)。次に、書き換え不可領域書き込みフラグ12が“済”であるか否かを判定し(SZ12)、“済”であるときは(Yes)すでにセキュアメモリ10に初期値が設定されているので、処理SZ1を終了する。書き換え不可領域書き込みフラグ12が“可”であるときは(No)、セキュアメモリ10に初期値を書き込んでいく(SZ13〜SZ18)。モードIDに加えて、暗号化されたプログラム固有鍵、アドレス管理情報、データ固有鍵をセキュアメモリ10の書き換え不可領域11に書き込む。なお、最初の判定の結果、セキュアメモリ10がLSIの外部にあると判定されたときは(SZ14でNo)、モードIDは商品動作モードを表す値に上書きされる(SZ15)。これにより、セキュアメモリ10がLSIパッケージ外にあるような不正な製品は、商品動作モードでしか動作できない。
【0033】
次に、書き込み不可領域書き込みフラグ12を“済”にセットする(SZ19)。これによって、以後の書き換え不可領域11の書き換えはできなくなる。さらに、通常領域13,14に暗号種別識別子および実装モードフラグを書き込む(SZ1A)。そして、モードIDがアドミニストレータモード以外のモードを示すときは(SZ1BでNo)、これらに加えて、暗号化された共有鍵/鍵生成鍵も通常領域13,14に書き込む(SZ1C)。
【0034】
その後、前処理SZ2を実行する。ここでは、セキュアメモリ10の書き込み不可領域11に設定されたモードIDが、鍵生成・更新シーケンサ30のモードID格納レジスタ31と、モードシーケンサ40のモードID格納レジスタ41とに設定される。また、セキュアメモリ10の第1の通常領域13に設定された暗号種別識別子が、鍵生成・更新シーケンサ30の暗号種別識別子格納レジスタ32と、モードシーケンサ40の暗号種別識別子格納レジスタ42とに設定される。さらに、セキュアメモリ10の書き換え不可領域11に格納されたアドレス管理情報が、MEMC80の暗号アドレス区分格納レジスタ81に設定される。ここまでの動作は、図2における初期値設定フェーズPA0,PB0,PC0,PD0に対応している。
【0035】
その後は、モードIDの値に応じて、それぞれのモードにおける動作を行う(SZ3)。このようにモードIDの値に応じて、セキュアLSIで行う動作を制限することによりプログラムの秘匿性を高めている。
【0036】
次に通常の商品動作(通常ブート処理)について詳細に説明する。
【0037】
モードIDが「11」のとき、セキュアLSI1は商品動作モードになり、実装モードフラグの値に応じて(SD0)、プログラム実装処理SD1、または通常ブート処理SD2を実行する。
【0038】
図5はプログラム実装処理SD1のフローチャート、図6、7はデータフローである。プログラム実装処理SD1においては、セキュアメモリ10に格納された固有鍵情報を用いてプログラム固有鍵を(SD11、SD12)、共有鍵情報を用いてプログラム共有鍵を復号し(SD13、SD14)、復号されたプログラム共有鍵とプログラム固有鍵を用いて外部メモリ100に格納されたプログラムEnc(プログラム、プログラム共有鍵)をEnc(プログラム、プログラム固有鍵)へと変換する(SD15−SD17)。その後、プログラムの正当性の検証を行い(SD18)、正当であるならば実装モードフラグをOFFに設定する(SD19)。これにより次回の起動時からはプログラム実装処理SD1は行われない。そして最後にセキュアメモリ10に格納されたプログラム共有鍵と、外部メモリ100に格納されたプログラムEnc(プログラム、プログラム共有鍵)は削除される(SD1A、SD1B)。
【0039】
図8は通常ブート処理SD2のフローチャート、図9、10はデータフローである。通常ブート処理SD2においては、まず、内部メモリとしてのセキュアメモリ10の書き込み不可領域11に格納された、固有鍵鍵情報としての暗号化されたプログラム固有鍵、すなわち、暗号化固有鍵Enc(プログラム固有鍵(平文)、MK0(平文第3中間鍵))および暗号化第2中間鍵Enc(MK0,CK0(平文第4中間鍵))を秘密鍵演算処理部20の暗号鍵格納レジスタに設定する(SD21)。そして、この暗号化されたプログラム固有鍵を、鍵生成・更新シーケンサ30に実装されたプログラム暗号種を用いて復号し、プログラム固有鍵を得る(SD22)。得られたプログラム固有鍵は秘密鍵演算処理部20のプログラム固有鍵格納レジスタ22と、外部ホストI/F50のプログラム復号用暗号エンジン54のプログラム固有鍵格納レジスタ58に設定する(SD23)。
【0040】
その後、セキュアメモリ10の書き込み不可領域11に格納されているデータ固有IDを秘密鍵演算処理部20の固有ID格納レジスタに設定する(SD24)。また、CPU65によって乱数を生成し、秘密鍵演算処理部20の乱数格納レジスタに設定する(SD25)。そして、秘密鍵演算処理部20によって、データ固有IDと乱数からデータ固有鍵を生成する(SD26)。コンテンツの再生にはデータ固有鍵を用いて行う。データ固有鍵は乱数を用いて生成されるため、起動毎に異なることとなり、コンテンツ再生の安全性が高まる。
【0041】
その後、外部メモリ100に格納されていた,プログラム固有鍵で暗号化されたプログラムEnc(プログラム,プログラム固有鍵)を、外部ホストI/F50が有するプログラム処理部51のプログラム復号用暗号エンジン54を介して復号し、HASH演算部70に取り込み、HASH値を演算する(SD27)。復号に用いられる鍵としては外部ホストI/Fのプログラム固有鍵格納レジスタ58に格納されたプログラム固有鍵が用いられる。そして、この演算したHASH値と、セキュアメモリ10の通常領域13に格納されていたHASH値とを比較し、プログラムが改ざんされていないかどうかをチェックする(SD28)。HASH値が一致していたとき(SD29でNo)、外部メモリ100に格納されていたプログラムEnc(プログラム,プログラム固有鍵)に処理を遷移し、アプリケーションを実行する(SD2A)。一方、HASH値が一致していないとき(SD29でYes)は、何らかの不正が行われたものと推定して、不正アクセス時制御による処理を実行する(SD2B)。
【0042】
ここで、上述のように商品として動作するセキュアLSIについて、プログラムの更新を行う処理について、図面を参照しながら説明する。図11はプログラム更新の際に、サーバ3とセキュアLSI1を含むシステムとの間におけるデータのやり取りを示すフローである。
【0043】
図11に示すように、まず、セキュアLSI1がプログラム更新処理を起動すると、サーバ3はシステムからセキュアLSI1のIDを受信してID認証を行い、認証した場合は、セキュアLSI1とSSL接続する(UD1)。これにより、サーバ3とセキュアLSI1を含むシステムとの間の通信路の安全性が一応確保される。
【0044】
通信路が確保されると、システムは、更新対象プログラムの識別情報であるアプリIDをサーバ3へ送信する(UD2)。サーバ3は、更新可能なプログラムのアプリIDと、プログラムを動作させて良いLSIのIDとの対応関係を示す第1のテーブル4を管理しており、この第1のテーブル4に基づいて、プログラムを送信してよいか否かを判断する。セキュアLSI1のIDと、更新を要求されたプログラムのアプリIDとの対応が確認されると、サーバ3は、この更新対象プログラムの送信を開始する。
【0045】
まず、サーバ3から、更新対象プログラムの付加情報をセキュアLSI1へ送信する(UD3)。ここでの付加情報は、セキュアLSI1側でプログラムを更新してよいか否かを認証させるための署名、更新対象プログラムのサイズ、および、更新対象プログラムのハッシュ値(平文での値)等を含む。セキュアLSI1は、付加情報として送信された署名を用いて認証を行い、また、送信されたプログラムサイズを基にして、外部メモリ100に更新可能な空き領域があるか否かを判断する。そして、更新が可能であると判断した場合は、サーバ3に対して、共有鍵情報を送信するよう要求する(UD4)。
【0046】
サーバ3は、要求を受信すると、共有鍵情報として、暗号化共有鍵Enc(プログラム共有鍵(平文),MK1(平文第1中間鍵))および暗号化第1中間鍵Enc(MK1,CK1(平文第2中間鍵))をセキュアLSI1へ送信する(UD5)。セキュアLSI1は、共有鍵情報を用いてプログラム共有鍵を復号し、復号された状態でハッシュ演算を行い、正当性の検証をする。プログラム共有鍵を正常に復号すると、システムはサーバ3に対して、共有鍵暗号化プログラムを送信するよう要求する(UD6)。サーバ3は、要求を受信すると、プログラムEnc(プログラム、プログラム共有鍵)をシステムへ送信する(UD7)。セキュアLSI1は、Enc(プログラム、プログラム共有鍵)をEnc(プログラム、プログラム固有鍵)へと変換する。さらに、変換されたEnc(プログラム、プログラム固有鍵)を平文プログラムに復号し、ハッシュ演算して、先に付加情報として受信したハッシュ値との比較によって、正当性を検証する。ここでの処理については、後で詳細に説明する。
【0047】
共有鍵暗号化プログラムが固有鍵暗号化プログラムに正常に変換できたとき、セキュアLSI1を含むシステムはサーバ3へ、アプリ固有情報を送信するよう要求する(UD8)。アプリ固有情報はプログラムの実行に必要な情報を含んでおり、アプリ固有情報がないと、セキュアLSI1は更新したプログラムを実行できない。サーバ3は、アプリ固有情報の送信履歴とLSIのIDとの対応関係を示す第2のテーブル5も管理しており、同一のセキュアLSIには複数のアプリ固有情報を送信しないようにする。よって、同一のセキュアLSIは複数回、同一のプログラムを更新することができない。
【0048】
サーバ3は、アプリ固有情報を送信してよいと判断したとき、アプリ固有情報をセキュアLSI1を含むシステムへ送信し(UD9)、セキュアLSI1がこれをハッシュ演算して正当性を検証すると、プログラム更新が終了し、通信は切断される(UD10)。
【0049】
なお、本発明におけるサーバ3とセキュアLSIを含むシステムとの間におけるデータのやり取りは上述のフローに限定されるものではない。例えば、サーバ3は、必ずしも、第2のテーブルを管理し、同一のセキュアLSIに複数のアプリ固有情報を送信しないようにする必要はない。しかしながら、同一のセキュアLSIに複数回、同一のプログラムを送信しないようにすることにより、プログラムの秘匿性はより高まる。
【0050】
また、付加情報、共有鍵情報、共有鍵暗号化プログラムは、必ずしも、サーバ3からセキュアLSIへと別々に送信する必要はなく、その一部、または全部をまとめたプログラムパッケージとして一度に送信してもよい。
【0051】
セキュアLSI1における、共有鍵暗号化プログラムEnc(プログラム、プログラム共有鍵)から固有鍵暗号化プログラムEnc(プログラム、プログラム固有鍵)への変換について、図面を参照しながら詳述する。図12は外部メモリ100に格納された、プログラム更新に係わるプログラムの構成を示す図である。
【0052】
図12に示すように、外部メモリ100には、固有鍵でそれぞれ暗号化された、暗号化制御プログラム200(Enc(制御プログラム、プログラム固有鍵))、および暗号化アプリケーションプログラム210(Enc(アプリケーションプログラム、プログラム固有鍵))が格納されている。
【0053】
暗号化制御プログラム200はアプリケーション起動部201およびプログラム更新制御部205を備え、プログラム更新制御部205は共有鍵復号部206、プログラム固有鍵暗号化処理部207およびプログラム更新成否判定部208を備えている。
【0054】
アプリケーション起動部201はブートROM60に格納されたブートプログラムからの指示を受けて、暗号化アプリケーションプログラム210を起動する。共有鍵復号部206はサーバ3から送信された共有鍵情報を基にして、鍵生成・更新シーケンサ30を用いて、プログラム共有鍵を復号する。プログラム固有鍵暗号化処理部207は鍵生成・更新シーケンサ30を用いて、共有鍵暗号化プログラムEnc(プログラム、プログラム共有鍵)から固有鍵暗号化プログラムEnc(プログラム、プログラム固有鍵)への変換を行う。プログラム更新成否判定部208は、固有鍵暗号化プログラムEnc(プログラム、プログラム固有鍵)を平文プログラムに復号し、ハッシュ検証によってプログラム更新の成否を判定する。そして、プログラム更新が成功したときは、古いプログラムを削除し、プログラム格納先・サイズなどの情報をセキュアメモリ10に格納する。
【0055】
暗号化アプリケーションプログラム210は、通常のアプリケーションプログラムである通常動作部211の他、サーバや記録媒体から新しいアプリケーションプログラムを取得するためのプログラム取得部212もアプリケーションプログラムとして備えている。プログラムの更新は、これらのような外部メモリ100に格納されたプログラムを用いて行われる。
【0056】
図13は共有鍵暗号化プログラムから固有鍵暗号化プログラムへの変換処理を含む、プログラム更新処理を示すフローチャートである。
【0057】
アプリケーションプログラムの実行中(SX1)に、ユーザの操作等の外部要因によってプログラムの更新が要求されると、システムはこれを検知し、プログラム更新を開始するために、通常動作部211が暗号化アプリケーションプログラム210の取得プログラムとしてのプログラム取得部212を起動する(SX2)。
【0058】
プログラム取得部212はサーバ3と通信して、認証や、共有鍵情報・プログラムの取得を行う(SX3)。サーバ3から共有鍵情報を取得すると、共有鍵復号部206はプログラム共有鍵を復号する(SX4,SX5)。すなわち、共有鍵鍵情報としての暗号化されたプログラム共有鍵Enc(プログラム共有鍵,MK2)、Enc(MK2,CK)を秘密鍵演算処理部20の暗号鍵格納レジスタ23に設定し、この暗号化されたプログラム共有鍵を、鍵生成・更新シーケンサ30に実装されたプログラム暗号種を用いて復号し、プログラム共有鍵を得る。得られたプログラム共有鍵は秘密鍵演算処理部20のプログラム共有鍵格納レジスタ21に格納される。
【0059】
次に、プログラム固有鍵暗号化処理部207が、共有鍵暗号化プログラムから固有鍵暗号化プログラムへの変換を行う。すなわち、サーバ3から送信され外部メモリ100に格納されていたプログラムEnc(プログラム,プログラム共有鍵)を、外部ホストI/F50が有するプログラム処理部51の暗号化用スルー部52を介して、秘密鍵演算処理部20に取り込む(SX6)。そして、取り込んだプログラムを、プログラム共有鍵格納レジスタ21に格納されたプログラム共有鍵で復号した後、プログラム固有鍵格納レジスタ22に格納されたプログラム固有鍵で暗号化し、プログラムEnc(プログラム,プログラム固有鍵)を得る。なお、上述したように、プログラム固有鍵はシステムの起動時にすでに復号されており、秘密鍵演算処理部20のプログラム固有鍵格納レジスタ22に格納されている。
【0060】
最後に、プログラム更新成否判定部208が、プログラム更新の成否を判定する。すなわち、Enc(プログラム,プログラム固有鍵)を外部メモリ100に書き込んだ(SX8)後、外部ホストI/F50が有するプログラム処理部51のプログラム復号用暗号エンジン53を用いて、復号して取り込み(SX9)、平文状態でのハッシュ値を演算する(SX10)。演算されたハッシュ値は、プログラム取得部212が暗号化プログラムとともに取得したハッシュ値と比較され、この比較によって更新の成否が判定される(SX11)。更新が成功したときは、古いプログラムを消去する(SX12)一方、更新が失敗したときは、送信されたプログラムを消去する(SX13)。そしてプログラム格納先、サイズなどの情報をセキュアメモリ10に書き込み(SX14)、更新処理が終了する。
【0061】
上述のプログラム更新方法を用いることによって、サーバからプログラム共有鍵暗号化プログラムを送信すると、セキュアLSIにおいて、暗号化する鍵がプログラム共有鍵からプログラム固有鍵に変換されて、システムに実装される。このため、たとえサーバからセキュアLSIへの通信路が不正にアクセスされプログラム共有鍵暗号化プログラムが盗み出されたとしても、このプログラムによってセキュアLSIを動作させることは、できない。また更新の結果、ユーザの持つ各製品では、互いに異なる固有鍵によって暗号化されたプログラムが実装されることになり、秘匿性が向上する。また、万一、暗号を破られた場合でも、被害を受ける製品の数が限定されることになり、従来よりもセキュリティが高まる。
【0062】
なお、本実施形態において、共有鍵情報をサーバから取得しているが、これは、商品動作モード「11」におけるプログラム実装(SD1)の最後において、復号されたプログラム共有鍵およびセキュアメモリ10上の共有鍵情報を削除しているためであり、これらを削除しない場合は、共有鍵情報はサーバから取得する必要はなく、セキュアメモリ10から読み出して復号すればよい。
【0063】
また、本実施形態では、外部要因によってプログラムの更新の開始が指示され、通常瞳サブ211がプログラム取得部212を起動し、プログラムの取得後はブートプログラムによって各処理を指示するものとしたが、本発明はこれに限られるものではない。例えば、ブートプログラムがプログラム取得部212を起動する構成にすることによって、さらにセキュリティを高めることができる。
【0064】
また、プログラム固有鍵は必ずしも製品毎に固有である必要はなく、品種ごとまたは複数個毎に同一であっても良い。1個の製品において暗号を破られたときに被害を少なくするのが本願発明のねらいであり、同一の鍵で暗号化されたプログラムを有するLSIの数を少しでも減らすだけで効果は充分に発揮できる。さらに言えば、プログラム固有鍵は全て共通であったとしても、通信路が破られ共有鍵暗号化プログラムが盗み出されたとしてもそのままではセキュアLSIで動作できないので、鍵を共有鍵から固有鍵に書き換えるだけでも、効果は発揮できる。
【図面の簡単な説明】
【0065】
【図1】本発明の実施形態に係るセキュアLSIの構成を示すブロック図である。
【図2】図1のセキュアLSIを用いた開発および製品化の全体の流れを表す図である。
【図3】ブートプログラムの全体的な処理の流れを示すフローチャートである。
【図4】セキュアメモリ初期値設定SZ1のデータフローである。
【図5】商品動作モードにおけるプログラム実装処理SD1のフローチャートである。
【図6】プログラム実装処理SD1のデータフロー1である。
【図7】プログラム実装処理SD1のデータフロー2である。
【図8】商品動作モードにおける通常ブート処理SD2のフローチャートである。
【図9】通常ブート処理SD2のデータフロー1である。
【図10】通常ブート処理SD2のデータフロー1である。
【図11】プログラム更新におけるサーバとの通信を示すフローチャートである。
【図12】外部メモリ100に格納された,プログラム更新に係わるプログラムの構成を示す図である。
【図13】プログラムの更新処理を示すフローチャートである。
【符号の説明】
【0066】
1 セキュアLSI
3 サーバ
4 第1のテーブル
5 第2のテーブル
10 セキュアメモリ(内部メモリ)
58 プログラム固有鍵格納レジスタ
60 ブートROM
100 外部メモリ
【特許請求の範囲】
【請求項1】
LSIを含むシステムにおけるプログラム更新のために、動作するサーバであって、
前記システムから、前記LSIのIDと、更新対象プログラムの識別情報であるアプリIDとを受信する第1ステップと、
アプリIDとLSIIDとの対応関係を示す第1のテーブルを参照して、前記更新対象プログラムを前記システムに送信するか否かを決定する第2ステップと、
前記第2ステップで送信すると決定したとき、前記システムへ、前記更新対象プログラムを共有鍵で暗号化した共有鍵暗号化プログラム、および前記共有鍵の基になる共有鍵情報を送信する第3ステップとを実行する
ことを特徴とするサーバ。
【請求項2】
請求項1記載のサーバにおいて、
前記システムから、前記更新対象プログラムの実行に必要なアプリ固有情報を要求する信号を受信する第4ステップと、
アプリ固有情報の送信履歴とLSIIDとの対応関係を示す第2のテーブルを参照して、前記第4のステップで要求されたアプリ固有情報を送信するか否かを決定する第5のステップとを実行する
ことを特徴とするサーバ。
【請求項3】
請求項1記載のサーバにおいて、
前記共有鍵情報は、平文共有鍵を平文第1中間鍵で暗号化した暗号化共有鍵と、前記平文第1中間鍵を平文第2中間鍵で暗号化した暗号化第1中間鍵とを含むものである
ことを特徴とするサーバ。
【請求項1】
LSIを含むシステムにおけるプログラム更新のために、動作するサーバであって、
前記システムから、前記LSIのIDと、更新対象プログラムの識別情報であるアプリIDとを受信する第1ステップと、
アプリIDとLSIIDとの対応関係を示す第1のテーブルを参照して、前記更新対象プログラムを前記システムに送信するか否かを決定する第2ステップと、
前記第2ステップで送信すると決定したとき、前記システムへ、前記更新対象プログラムを共有鍵で暗号化した共有鍵暗号化プログラム、および前記共有鍵の基になる共有鍵情報を送信する第3ステップとを実行する
ことを特徴とするサーバ。
【請求項2】
請求項1記載のサーバにおいて、
前記システムから、前記更新対象プログラムの実行に必要なアプリ固有情報を要求する信号を受信する第4ステップと、
アプリ固有情報の送信履歴とLSIIDとの対応関係を示す第2のテーブルを参照して、前記第4のステップで要求されたアプリ固有情報を送信するか否かを決定する第5のステップとを実行する
ことを特徴とするサーバ。
【請求項3】
請求項1記載のサーバにおいて、
前記共有鍵情報は、平文共有鍵を平文第1中間鍵で暗号化した暗号化共有鍵と、前記平文第1中間鍵を平文第2中間鍵で暗号化した暗号化第1中間鍵とを含むものである
ことを特徴とするサーバ。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【公開番号】特開2007−272923(P2007−272923A)
【公開日】平成19年10月18日(2007.10.18)
【国際特許分類】
【出願番号】特願2007−148054(P2007−148054)
【出願日】平成19年6月4日(2007.6.4)
【分割の表示】特願2002−331992(P2002−331992)の分割
【原出願日】平成14年11月15日(2002.11.15)
【出願人】(000005821)松下電器産業株式会社 (73,050)
【Fターム(参考)】
【公開日】平成19年10月18日(2007.10.18)
【国際特許分類】
【出願日】平成19年6月4日(2007.6.4)
【分割の表示】特願2002−331992(P2002−331992)の分割
【原出願日】平成14年11月15日(2002.11.15)
【出願人】(000005821)松下電器産業株式会社 (73,050)
【Fターム(参考)】
[ Back to top ]