(57)【要約】【課題】不正をほぼ検出できるプログラム検証装置を提供する。【解決手段】プログラムデータを保安データストレージに貯蔵する際に、プログラムデータにCRC演算を行って第1チェックサム値を得る。さらに、保安データストレージに伝送されたプログラムデータにCRC演算を行って第2チェックサム値を得る。両者を比較してプログラム検証を実行する。ループ回数ロジック700は、CRC演算を少なくとも2回以上実行させるとともにそのループ回数を判定する。演算順序ロジック800は、CRC演算のループ回数毎にCRC演算の演算順序を変更する。【選択図】図1
2010218237.tif 000002
【特許請求の範囲】
【請求項１】
CRC演算を行ってプログラム検証を実行するプログラム検証装置において、
前記CRC演算を少なくとも2回以上実行させるとともにそのループ回数を判定するループ回数ロジックと、
前記CRC演算のループ回数毎にCRC演算の演算順序を変更する演算順序ロジックと、
を備えることを特徴とするプログラム検証装置。
【請求項２】
請求項1に記載のプログラム検証装置において、
前記ループ回数ロジックは、
前記CRC演算のループ回数を数えるループ回数カウンタと、
CRC演算のループ所定回数を示すパラメータを持つループ回数設定部と、
ループ回数が所定回数に達したかを判定するループ回数判定回路と、を備える
ことを特徴とするプログラム検証装置。
【請求項３】
請求項1または請求項2に記載のプログラム検証装置において、
前記演算順序ロジックは、ループ回数ごとにデータ並び順を変更するデータ並び位置変更回路を備える
ことを特徴とするプログラム検証装置。
【請求項４】
請求項1から請求項3のいずれかに記載のプログラム検証装置において、
プログラム検証でデータを保持するデータ保持回路を備え、
前記演算順序ロジックは、ループ回数ごとに前記データ保持回路からの読み出しアドレスを変更するアドレス生成回路を備える
ことを特徴とするプログラム検証装置。
【請求項５】
請求項4に記載のプログラム検証装置において、
前記アドレス生成回路は、ループ回数ごとに、開始アドレス、終了アドレスおよび更新手順の少なくとも一つを変更する
ことを特徴とするプログラム検証装置。
【請求項６】
CRC演算を行ってプログラム検証を実行するプログラム検証方法において、
前記CRC演算を少なくとも2回以上実行させ、
前記CRC演算のループ回数を判定し、
前記CRC演算のループ回数毎にCRC演算の演算順序を変更する
ことを特徴とするプログラム検証方法。
【請求項７】
請求項6に記載のプログラム検証方法において、
前記CRC演算のループ回数毎にCRC演算の演算順序を変更する工程は、
プログラム検証でデータを保持するデータ保持回路への読み出しアドレスをループごとに生成する工程と、
前記データ保持回路から読み出したデータの並び位置をループごとに変更する工程と、を備える
ことを特徴とするプログラム検証方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム検証装置及びその方法に関する。たとえば、デジタル映像のコンテンツを扱うデジタルTV等の分野に関する。
【背景技術】
【０００２】
近年、デジタルTVなどのデジタル映像コンテンツを扱う分野において、アナログ放送からデジタル放送への移行が急速かつ世界的に広がっている。
デジタル放送は、不正視聴や不正コピーを防止する目的で暗号化が掛かっているが、不正行為により暗号化が破られており、放送業者はより強い暗号化方式への変更を余儀なくされている。
これに伴い、コンテンツのみならずそれらを扱う半導体機器に対する改ざんを防止するためのセキュリティ強度向上の要求が高まってきた。
【０００３】
図4は、特許文献1に開示されるスマートカードの概略を表す機能ブロック図である。
スマートカード1000は、制御ユニット100と、インターフェースブロック200と、RAM 300と、ROM 400と、保安データストレージ500と、を備える。
制御ユニット100は、スマートカード1000の全般的な動作を制御する
RAM 300は、ワークメモリ（work memory）として動作し、保安データストレージ500に貯蔵されるまたは保安データストレージ500から読み出したデータを一時貯蔵するのに使用される。
保安データストレージ500は、制御ユニット100の制御によって保安が必要なデータ（例えば、金融情報）を貯蔵するのに使用される。
【０００４】
ここで、スマートカード1000の保安データストレージ500に貯蔵されるデータは高い保安性を要する。
貯蔵されるデータとしては、例えば、金融情報などが例示される。そして、スマートカード1000の保安データストレージ500にデータをプログラムする場合、データが正しく書き込まれているか否かを検証する必要がある。すなわち、外部攻撃などによって不正操作されたデータがプログラムされるのを防止する必要がある。
プログラム検証として、CRC方式（Cyclic Redundancy Check：巡回冗長検査）が知られている。
【０００５】
図5は、制御ユニットの構成をより詳細に示す機能ブロック図である。
制御ユニット100は、ランダム遅延制御ロジック110と、バッファメモリ120と、データコピー及び制御ロジック130と、CRC演算ロジック140と、CRCレジスタ150と、比較器160と、レジスタ171、172と、訂正／検出制御ロジック180と、信号発生器190と、を備える。
【０００６】
プログラムデータは、RAM 300から保安データストレージ500のページバッファ504に転送される。
ランダム遅延制御ロジック110は、RAM 300からのプログラムデータがページバッファ504に転送された後に、このプログラムデータがバッファメモリ120にコピーされるようにする。
ランダム遅延制御ロジック110は、RAM 300に貯蔵されたプログラムデータが全部バッファメモリ120にコピーされる時に、フラッグ信号FUDC_ENDを発生する。
フラッグ信号FUDC_ENDの活性化は、RAM 300に貯蔵されたプログラムデータの総てがバッファメモリ120にコピーされたことを示す。
【０００７】
CRC演算ロジック140には、データコピー及び制御ロジック130からの制御信号F_CRC_STが入力される。
CRC演算ロジック140は、この制御信号F_CRC_STを受けると、バッファメモリ120に貯蔵されたデータに対するCRC演算動作を実行する。
また同時に、CRC演算ロジック140は、制御信号F_CRC_STを受けると、保安データストレージ500のアレイ501から直接データを読み出し、読み出したデータに対するCRC演算動作を実行する。
CRC演算ロジック140によって演算された結果値（すなわち、各結果値は2バイトチェックサム値に対応する）は、CRCレジスタ150に貯蔵される。
CRCレジスタ150には、2回のCRC演算過程を通じて獲得した2個の2バイトチェックサム値が貯蔵される。
CRC演算ロジック140は、CRC演算動作が完了する度にフラッグ信号FCRC_ENDを発生する。
【０００８】
比較器160は、データコピー及び制御ロジック130からの制御信号FCOMP1を受ける。
比較器160は、前記制御信号FCOMP1を受けると、ページバッファ504に貯蔵されたデータとバッファメモリ120に貯蔵されたデータとを比較する。
比較器160は、比較結果としてフラッグ信号FMTCとフラッグ信号FNMTCのうちのいずれか一方を活性化させる。
フラッグ信号FMTCの活性化は、ページバッファ504に貯蔵されたデータがバッファメモリ120に貯蔵されたデータと一致することを示す。
フラッグ信号FNMTCの活性化は、ページバッファ504に貯蔵されたデータがバッファメモリ120に貯蔵されたデータと一致しないことを示す。
【０００９】
以後、説明するように、フラッグ信号FNMTCが活性化される場合は、ページバッファ504にロードされたデータは外部攻撃によって不正操作されたデータであり、プログラム動作は中止される。
【００１０】
また、比較器160は、データコピー及び制御ロジック130からの制御信号FCOMP2を受ける。
制御信号FCOMP2を受けた場合、比較器160は、CRCレジスタ150に貯蔵された結果値（CRC1、CRC2）を比較し、比較結果としてフラッグ信号FCRC_OKまたはFCRC_NOKを発生する。
フラッグ信号FCRC_NOKは、CRCレジスタ150に貯蔵された結果値（CRC1、CRC2）が一致しないことを意味する。
フラッグ信号FCRC_OKは、CRCレジスタ150に貯蔵された結果値（CRC1、CRC2）が一致することを意味する。
【００１１】
レジスタ171は、保安データストレージ500の制御情報を貯蔵するためのもので、高電圧活性化情報、セルフタイマ活性化情報、命令情報などを貯蔵する。
レジスタ172は、保安データストレージ500の書き込み動作に対する検証情報を貯蔵するためのもので、8ビットレジスタである。
【００１２】
ここで、［0］ビットは、保安データストレージ500のプログラミング検証オン／オフ制御ビットである。
そして、ロジック'0'の値は検証機能がオフされることを示し、ロジック'1'の値は検証機能がオンされることを示す。
初期値は、ロジック'0'の値に設定される。
【００１３】
［1］ビットは、エラー訂正／検出選択情報ビットである。
そして、ロジック'0'の値はエラー検出機能が選択されたことを示し、ロジック'1'の値はエラー訂正機能が選択されたことを示す。
【００１４】
［2］ビットは、外部攻撃検出フラッグビットである。
［2］ビットがロジック'0'の値に設定されることは、プログラムデータが外部攻撃によって不正操作されなかったことを示す。
また、［2］ビットがロジック'1'の値に設定されることはプログラムデータが外部攻撃によって不正操作されたことを示す。
【００１５】
［5］ビットは、インタラプト発生制御ビットである。
そして、ロジック'0'の値はインタラプト発生機能がオフされることを示し、ロジック'１'の値はインタラプト発生機能がオンされることを示す。
【００１６】
［6］ビットは、エラー検出フラッグビットとして、制御ユニット100のマイクロプロセッサまたはCPU（図示しない）によって設定される。
そして、ロジック'0'の値は、エラーが検出されなかったことを示し、ロジック'１'の値はエラーが検出されたことを示す。
【００１７】
ここで、［5］ビットは、［1］ビットがロジック'0'の値に設定される時のみ有効な情報である。すなわち、［1］ビットがロジック'0'の値に設定された場合は、［5］ビットがロジック'1'に設定される時、インタラプトが発生する。
［1］ビットがロジック'1'の値に設定された場合は、エラーが検出されてもインタラプトは発生しない。
［6］ビットは、エラー検出機能が選択された場合（［1］ビットがロジック'0'の値に設定された場合）エラーが発生する時設定され、次に活性化される高電圧の活性化信号によってクリアされる。
残りの［3］‐［4］と［7］ビットは、予備ビット（reserved bits）である。
【００１８】
続いて、訂正／検出制御ロジック180は、レジスタ172に貯蔵された情報及びフラッグ信号FNMTC、FCRC_NOK、FCRC_OKに応答してプログラム終了信号PGM_END、外部攻撃検出信号ATT_DET、再プログラム信号FRPGM、及びインタラプト信号FIQを発生する。
例えば、フラッグ信号FNMTCが活性化される場合は、訂正／検出制御ロジック180はプログラム終了信号PGM_ENDと外部攻撃検出信号ATT_DETとを活性化させる。
また、訂正／検出制御ロジック180は、レジスタ172の［5］ビットが設定されたか否かによってインタラプト信号FIQを発生する。
【００１９】
訂正／検出制御ロジック180は、フラッグ信号FCRC_OKが活性化される時、プログラム終了信号PGM_ENDを活性化させる。
これは、プログラム手続きが終了するようにする。
フラッグ信号FCRC_NOKが活性化される場合、訂正／検出制御ロジック180は、レジスタ172の［1］ビットが設定されたか否かによって再プログラム信号FRPGMまたはプログラム終了信号PGM_END及びインタラプト信号FIQを活性化させる。
【００２０】
信号発生器190は、レジスタ171に貯蔵された命令情報とデータコピー及び制御ロジック130からの制御信号FRBC_ENDとに応答してフラッグ信号FBLDC、FBCのうちの一つを活性化させる。
例えば、消去及び書き込む動作または書き込む動作を知らせる命令がレジスタ171に設定された場合、信号発生器190は、制御信号FRBC_ENDの活性化に応答してフラッグ信号FBLDCを発生する。
消去動作を知らせる命令がレジスタ171に設定された場合、信号発生器190は、制御信号FRBC_ENDの活性化に応答してフラッグ信号FBCを発生する。
【００２１】
図6は、従来のスマートカード制御ユニットによるプログラム検証のフローチャートである。
制御ユニット100は、外部装置によって動作を開始し、RAM 300からページバッファ504にプログラムデータを転送（ステップF100）後、外部攻撃によってページバッファ504のプログラムデータが不正操作されたか否かを判別し、判別結果によってページバッファ504のプログラムデータを保安データストレージ500の選択されたページに貯蔵されるようにする。
【００２２】
ランダム遅延制御ロジック110は、ページバッファ504にプログラムデータが転送された後、RAM 300からバッファメモリ120にプログラムデータを転送する（ステップF101）。
【００２３】
データコピー及び制御ロジック130は、バッファメモリ120にプログラムデータが転送された後、バッファメモリ120のプログラムデータに対する第1チェックサム値を計算するために、CRC演算ロジック140へCRC演算実行を指示する（ステップF102）。
CRC演算ロジック140は、バッファメモリ120のプログラムデータに対してCRC演算を実行し、第1チェックサム値を計算する（ステップF103）。
【００２４】
第1チェックサム値が計算された後、データコピー及び制御ロジック130は、ページバッファ504のプログラムデータをバッファメモリ120に転送する（ステップF104）。
データコピー及び制御ロジック130は、バッファメモリ120にプログラムデータが転送された後、バッファメモリ120のプログラムデータに対する第2チェックサム値を計算するために、CRC演算ロジック140へCRC演算実行を指示する（ステップF105）。
【００２５】
CRC演算ロジック140は、バッファメモリ120のプログラムデータに対してCRC演算を実行し、第2チェックサム値を計算する（ステップF106）。
第2チェックサム値が計算された後、比較器160は、第1チェックサム値と第2チェックサム値を比較する（ステップF107）。
比較器160は、比較結果が一致の場合、処理を終了し、不一致の場合、訂正／検出制御ロジック180に通知する（ステップF108）。
訂正／検出制御ロジック180は、プログラム終了信号を発生し、処理を終了する（ステップF109）。
【００２６】
また、特許文献2には、記録媒体からのデータ読出し時に発生する誤りを訂正するとともに、誤り訂正処理の結果に誤りが有るか否かを検査する訂正検査方法が開示されている。
特許文献2に開示される訂正検査方法は以下の手順で実行される。
まず、PI方向に（セクタの行方向）対応した誤り検出符号を備えるデータに対し、誤り検出符号を用いて検査演算を行い、第1標本値を得る。
次に、データブロックのPI方向に誤り訂正を行う。
続いて、PI方向の誤り訂正によって得られた訂正値に対して検査演算を行って第2標本値を生成する。
得られた第1標本値と第2標本値とを比較して、第1検査値を生成する。
さらに、PI方向に誤り訂正がなされた基礎データに対して、PI方向とは異なるPO方向（セクタを跨る列方向）に誤り訂正を行う。
PO方向の誤り訂正によって得られた訂正値をPI方向に沿って検査演算を行い、第3標本値を生成する。
そして、第1検査値と第3標本値とを比較して、前記第2方向の誤り訂正を検査する第2検査値を生成する。
なお、特許文献2においては、基礎データの読み出し回数を減らして訂正検査に掛かる時間を短縮するため、前記第3標本値を得るにあたっては、PI方向に沿って演算できるようにソートしたあとでPI方向に検査演算を実行することとしている。
【先行技術文献】
【特許文献】
【００２７】
【特許文献１】特開2007-183937号公報の図2
【特許文献２】特開2000-4170号公報
【発明の概要】
【発明が解決しようとする課題】
【００２８】
特許文献1では、RAM内のプログラムデータとページバッファ内のプログラムデータとにそれぞれ1回のCRC演算を行い、両者のCRC演算結果を比較することによりページバッファに改ざんがないかを判断している。
しかしながら、同一プログラムに対するCRC演算の実行が1回であるため生成多項式が流出した場合、プログラムの一部（生成多項式のビット長）を操作することにより、一意のCRC演算結果を得る事が出来てしまう。
そのため、上記に説明した従来のプログラム検証方法では、保安データストレージ500に貯蔵するプログラムが改ざんを受けやすいという問題がある。
【００２９】
また、特許文献2に開示される方法では、誤り訂正前と、PI方向の誤り訂正後と、PO方向の誤り訂正後と、でそれぞれ検査演算を実行している。
このような処理によれば、誤り訂正処理が正しく行われたか否かをチェックすることができる。
しかしながら、特許文献2では、データの訂正前と訂正後とに検査演算を実行するので、演算対象とするデータがそもそも異なっている。また、検査演算の方向は常にPI方向で一定である。
したがって、特許文献2の訂正検査方法であっても、生成多項式が流出してプログラム改ざんが行われるような場合には、これをチェックすることは原理的にできない。
【課題を解決するための手段】
【００３０】
本発明のプログラム検証装置は、CRC演算を行ってプログラム検証を実行するプログラム検証装置において、前記CRC演算を少なくとも2回以上実行させるとともにそのループ回数を判定するループ回数ロジックと、前記CRC演算のループ回数毎にCRC演算の演算順序を変更する演算順序ロジックと、を備えることを特徴とする。
【００３１】
また、本発明のプログラム検証方法は、CRC演算を行って得たプログラム検証を実行するプログラム検証方法において、前記CRC演算を少なくとも2回以上実行させ、前記CRC演算のループ回数を判定し、前記CRC演算のループ回数毎にCRC演算の演算順序を変更することを特徴とする。
【００３２】
このような構成によれば、ループ1回目のCRC演算結果と以降のCRC演算結果とでは演算順序が違うため演算結果が異なるようにし、かつ、CRC演算の対象は同じため各々のCRC演算結果に相関関係があるようにできる。これにより、仮に生成多項式が流出してプログラムの一部（生成多項式のビット長）に改ざんが加えられても、本発明のプログラム検証によって改ざん等の不正をほぼ検出でき、不正操作をできなくすることができる。
【図面の簡単な説明】
【００３３】
【図１】プログラム検証の回路図。
【図２】プログラム検証のフローチャート。
【図３】バッファメモリ構成例を示す図。
【図４】従来のスマートカードを示す図。
【図５】従来のスマートカード制御ユニットによるプログラム検証の回路図。
【図６】従来のスマートカード制御ユニットによるプログラム検証のフローチャート。
【発明を実施するための形態】
【００３４】
以下、図面を参照して本発明の実施の形態について説明する。
（第1実施形態）
図1は、プログラム検証装置の回路図であり、図5と同一の部分は同じ番号を附してその説明は省略する。
図1は、図5に対してループ回数ロジック700と演算順序ロジック800を追加し、さらに、ランダム遅延制御ロジック110を実行制御ロジック910に変更した構成になっている。
【００３５】
ループ回数ロジック700は、ループ回数カウンタ701と、ループ回数設定部702と、ループ回数判定回路703と、を備える。
【００３６】
ループ回数カウンタ701は、演算のループ回数をカウントする。
ループ回数のカウントは、ループ回数判定回路703からの再実行指令をカウントすることによるが、この点は後述する。そして、ループ回数カウンタ701は、ループ回数判定回路703および演算順序設定部801に演算のループ回数を示すループ回数信号10を出力する。
【００３７】
ループ回数設定部702には、演算のループを繰り返す回数が予め設定されている。
ループ回数設定部702は、設定されたループ回数をループ回数設定信号11によってループ回数判定回路703に与える。
【００３８】
ループ回数判定回路703は、チェックサム値の比較結果の一致を示す信号FMTCを比較器160から受け取り、ループ回数カウンタ701と実行制御ロジック910とに演算の再実行信号12を出力する。
【００３９】
演算順序ロジック800は、演算順序設定部801と、アドレス生成回路802と、データ並び位置変更回路803と、を備える。
演算順序設定部801は、アドレス生成回路802にアドレス順序信号13、データ並び位置変更回路803にデータ順序信号14を出力する。
演算順序設定部801には、ループ回数毎にCRC演算を実行する演算順序パラメータが予め設定されている。
演算順序パラメータは、アドレス順序とデータ順序とから構成される。
アドレス順序は、開始アドレス、終了アドレス、アドレス更新手順から構成される。
【００４０】
アドレス生成回路802には、データコピー及び制御ロジック130からCRC演算の実行開始を示す信号F_CRC_STが入力され、演算順序設定部801からアドレス順序信号13が入力される。
また、アドレス生成回路802は、バッファメモリ120に読み出しアドレスを示すアドレス信号15を出力する。
【００４１】
データ並び位置変更回路803には、バッファメモリ120から読み出したデータであるリードデータ信号16が入力される。
また、データ並び位置変更回路803は、CRC演算ロジック140に並び位置を変更したデータである演算データ信号17を出力する。
【００４２】
図2は、本実施形態に係るプログラム検証方法のフローチャートであり、図2を用いて図1の動作を説明する。
なお、図6と同一の部分は、同じ番号を附してその説明は省略する。
【００４３】
本実施形態では、ステップF101からステップF206のCRC演算をループ状に繰り返す。
このとき、ループ回数ごとに演算順序を変更する（ステップF200）
【００４４】
本実施形態では、ステップF100、ステップF101のあと、CRC演算の実行を指示する前に、演算順序の変更を行う（ステップF200）。
演算順序設定部801は、ループ回数カウンタ701からループ回数信号10を受ける。そして、ループ回数ごとに設定されたアドレス順序とデータ順序とからなる演算順序パラメータを読み出し、読み出した値にアドレス順序とデータ順序とを変更する（ステップF200）。
演算順序設定部801は、アドレス順序信号13をアドレス生成回路802に出力し、データ順序信号14をデータ並び位置変更回路803に出力する。
【００４５】
次に、第1チェックサム値を求めるためのCRC演算の工程（ステップF103）までの工程について説明する。
アドレス生成回路802は、CRC演算の実行開始を示す信号F_CRC_STにより動作を開始する。
アドレス生成回路802は、アドレス順序信号13に従いバッファメモリ120の読み出しアドレスを生成する。
読み出しアドレスは、開始アドレスから始まり、バッファメモリ120からデータを読み出す毎にアドレス更新手順に従い更新され、終了アドレスになった時点で終了する（ステップF201）。
アドレスは、アドレス信号15としてバッファメモリ120に出力される。
【００４６】
データ並び位置変更回路803は、データ順序信号14に従いバッファメモリ120から読み出したリードデータ信号16のデータビットの並び位置を変更する。
データ並び位置変更回路803は、変更後のデータを演算データ信号17として、CRC演算ロジック140へ出力する（ステップF202）。
CRC演算ロジック140でCRC演算を実行する（ステップF103）。
【００４７】
次に、第2チェックサム値を求めるためのCRC演算では、第1チェックサム値を求めるための動作と同じであるため詳細な説明は省略する。
【００４８】
なお、第2チェックサム値を求めるためのCRC演算において、アドレス生成回路802によるアドレス生成（ステップF203）とデータ並び位置変更回路803によるデータ並び位置変更（ステップF204）とは、第1チェックサム値を求めるためのステップF201とステップF202とにそれぞれ相当するものである。
【００４９】
得られたチェックサム値は、CRCレジスタ150を介して比較器160に送られて比較される（ステップF107）。
【００５０】
ループ回数を判定するための動作について説明する。
比較器160は、一致の場合（ステップF108：YES）、ループ回数判定回路703に信号（FMTC）を出力する。
ループ回数判定回路703は、比較器160からチェックサム値の比較結果の一致を示す信号FMTCを受けると、演算のループ回数信号10と演算のループ回数設定信号11を比較する事により、CRC演算のループ回数が所定回数に達したかを判定する（ステップF205）。
ループ回数判定回路703は、所定回数に到達していた場合（ステップF206：YES）、処理を終了し、所定回数に到達していない場合は（ステップF206：NO）、CRC演算の再実行信号12を出力し、CRC演算を継続させる。
尚、ループ回数カウンタ701は、再実行信号12を受け、ループ回数を更新する。
【００５１】
ループ2回目のCRC演算では、ステップF200において、演算順序設定部801がループ回数に応じてCRC演算の演算順序を変更することになる（ステップF200）。
これにより、ループ2回目のCRC演算における演算順序は、ループ1回目の演算順序と異なることになる。その他の動作はループ1回目のCRC演算と同様である。
【００５２】
本実施形態では、CRC演算のループ回数を判定するループ回数ロジック700と、CRC演算のループ回数毎に演算順序を変更する演算順序ロジック800と、実行制御ロジック910と、を有している。
ループ回数ロジック700により複数回のCRC演算が可能となり、かつ、演算順序ロジック800によってメモリ120へのアドレス生成と読み出したデータの並び替えとを行うことができる。すると、1回目のCRC演算結果と以降のCRC演算結果とは、演算順序の変更によってCRC演算結果が異なり、かつ、CRC演算の対象は同じため各々のCRC演算結果に相関関係があるようにできる。
したがって、本実施形態によれば、生成多項式が流出した場合でもプログラムの一部（生成多項式のビット長）の改ざんが、ほぼ出来なくなる。
【００５３】
本実施形態におけるバッファメモリ構成と演算順序とについて、具体例を挙げ動作を説明する。
説明のために次のように仮定をおく。
バッファメモリ120の構成としては、ビット幅とワード数によるメモリサイズとアドレス範囲とを仮定する。
ここでは、32ビット幅8ワードの32バイト、アドレス範囲を0〜7と仮定する。
【００５４】
図3は、前記仮定したバッファメモリ120の構成例である。
図3のD0〜D31は、アドレス0〜7に対応したバイトデータを表している。
アドレス0のデータは、バイトデータD3、D2、D1、D0の32ビットデータで構成され、同様にアドレス1〜アドレス6のデータも図3に示すように構成されている。
なお、アドレス7のデータはバイトデータD31、D30、D29、D28の３２ビットデータから構成される。
【００５５】
生成多項式としては、CRC演算ロジック140に入力される演算対象となるデータビット幅と、CRCデータのビット幅と、CRC演算ロジック140から出力されるCRCデータのビット幅と、を仮定する。
対象データ幅を8ビット、CRC32（32ビット）を入力とし、CRC32（32ビット）を出力すると仮定する。
【００５６】
CRC演算をループする設定回数としては、2回と仮定する。
【００５７】
CRC1演算アドレス順序としては、ループ1回目のCRC演算を開始するバッファメモリの開始アドレスと、CRC演算を終了するバッファメモリの終了アドレスと、アドレス更新手順と、を仮定する。
開始アドレスを0、終了アドレスを7とする。
アドレス更新手順は、2ワードずつ増加して、アドレスが6の場合のみ次アドレスを1とする。
【００５８】
CRC2演算アドレス順序としては、ループ2回目のCRC演算を開始するバッファメモリの開始アドレスと、CRC演算を終了するバッファメモリの終了アドレスと、アドレス更新手順とを仮定する。
開始アドレスを1、終了アドレスを6とする。
アドレス更新手順は、2ワードずつ増加して、7の場合のみ次アドレスを0とする。
【００５９】
CRC1演算データ順序として、ループ1回目のバッファメモリ120から読み出したデータの並び位置を変更する順番を仮定する。
バッファメモリ120から読み出したデータ（32ビット）の並び位置をB3、B2、B1、B0からB2、B3、B0、B1に並べ替えると仮定する。
【００６０】
CRC2演算データ順序として、ループ2回目のバッファメモリ120から読み出したデータの並び位置を変更する順番を仮定する。
バッファメモリ120から読み出したデータ（32ビット）の並び位置をB3、B2、B1、B0からB3、B1、B2、B0に並べかえると仮定する。
【００６１】
なお、前記並び位置B3、B2、B1、B0は、それぞれバイトデータであることを示す。
各並び位置をビット位置で表現すると、並び位置B3がビット位置31ビット〜24ビット、並び位置B2がビット位置23ビット〜16ビット、並び位置B1がビット位置15ビット〜8ビット、並び位置B0がビット位置7ビット〜0ビット、となる。
【００６２】
このような仮定のもとでの動作について説明する。
ループ1回目のバッファメモリアドレスは、アドレス0から始まり、アドレス2、4と2ワードずつ増加させ、アドレス6になった時、次のアドレスをアドレス1にし、以降はアドレス3、5と2ワードずつ増加させ、アドレス7になった時にCRC演算を終了する。
【００６３】
ループ2回目のバッファメモリアドレスは、アドレス1から始まり、アドレス3、5と2ワードずつ増加させ、アドレス7になった時、次のアドレスをアドレス0に設定し、以降はアドレス2、4と2ワードずつ増加させ、アドレス6になった時にCRC演算を終了する。
【００６４】
従って、ループ1回目のバッファメモリアドレスは、アドレス0、2、4、6、1、3、5、7の順に推移し、ループ2回目のバッファメモリアドレスは、アドレス1、3、5、7、0、2、4、6の順に推移する。
【００６５】
一方、ループ1回目のデータ並び位置は、B2、B3、B0、B1の様になり、ループ2回目のデータ並び位置は、B3、B1、B2、B0の様になる。
【００６６】
従って、前述の組み合わせにより、CRC演算のループ1回目の演算データの並びは、
バイトデータ
D2、D3、D0、D1、D10、D11、D8、D9、D18、D19、D16、D17、D26、D27、D24、D25、D6、D7、D4、D5、D14、D15、D12、D13、D22、D23、D20、D21、D30、D31、D28、D29、
となる。
【００６７】
また、CRC演算のループ2回目の演算データの並びは、
バイトデータ
D7、D5、D6、D4、D15、D13、D14、D12、D23、D21、D22、D20、D31、D29、D30、D28、D3、D1、D2、D0、D11、D9、D10、D8、D19、D17、D18、D16、D27、D25、D26、D24、
となる。
【００６８】
以上の具体例において、1回目のCRC演算と2回目のCRC演算とは、演算するデータの並びが違うため、演算結果が異なる。
その一方、1回目のCRC演算と2回目のCRC演算とは、演算順序が異なるだけでCRC演算の対象（バイトデータD0〜D31）は同じであるため、1回目のCRC演算結果が一致する様にプログラムの一部（生成多項式のビット長）を操作して改ざんを試みた場合であっても2回目のCRC演算結果は不一致となる。
したがって、データに改ざんが加えられているかどうかをほぼ検出できる。
仮に生成多項式が流出してプログラムの一部（生成多項式のビット長）に操作がくわえられた場合であってもこれをほぼ検出できるので、不正操作によって本実施形態のプログラム検証をすり抜けることは不可能である。
また、バッファメモリ120からデータを読み出すためのアドレス生成において、開始アドレス、終了アドレス、アドレス更新手順を異なった値にすることで、複数通りの組み合わせが容易に作成できる。
【００６９】
このような構成からなる本実施形態によれば、次の効果を奏することができる。
（1）第1の効果としては、生成多項式が流出してプログラムの一部（生成多項式のビット長）に改ざんが加えられても、本実施形態のプログラム検証によってこのような不正をほぼ検出できることがある。すなわち、流出した生成多項式に基づいてプログラムの一部（生成多項式のビット長）を操作する改ざんはほぼ出来なくすることができる。
その理由は、ループ1回目のCRC演算結果と以降のCRC演算結果とでは演算順序が違うため演算結果が異なるようにし、かつ、CRC演算の対象は同じため各々のCRC演算結果に相関関係があるようにできるからである。
【００７０】
（2）第2の効果としては、バッファメモリからデータを読み出すためのアドレス生成の組み合わせを変えることが容易なことである。
その理由は、開始アドレス、終了アドレス、アドレス更新手順を異なった値にすることだけで、複数通りの組み合わせができるためである。
【００７１】
（3）第3の効果としては、バッファメモリ120から読み出したデータの並び位置変更が容易なことである。
その理由は、データの並び位置を変更する場合に処理するデータの単位として複数バイト単位からビット単位での設定が可能なためである。
【００７２】
（4）第4の効果としては、演算順序が流出した場合であっても、演算順序や演算回数を容易に変更できることがある。
その理由は、演算順序と演算回数はハードウェアで固定せず、外部装置からでも設定が出来るからである。
【００７３】
なお、本発明は上記実施の形態に限られたものではなく、趣旨を逸脱しない範囲で適宜変更することが可能である。
処理するデータの単位としては、1バイト単位のデータ並び位置を変更する場合を例示したが、任意のビット単位の場合も可能であることはもちろんである。同様に、ループ設定回数、データ並び順等も上記具体例に限定されないのはもちろんである。
【００７４】
制御ユニットは、制御処理、演算処理等を行うCPU（Central Processing Unit）、CPUによって実行される制御プログラム、演算プログラム等が記憶されたROM（Read Only Memory）、処理データ等を一時的に記憶するRAM（Random Access Memory）等を有し、所定のプログラムによって前記ループ回数ロジック、演算順序ロジックとして機能するようにし、上記実施形態で説明した各工程を実行させるようにしてもよい。
【００７５】
上記実施形態および具体例におけるプログラム検証装置としては、保安データストレージ（メモリ）を組み込んだスマートカードの場合を例示したが、本発明は、このように保安データストレージ（メモリ）を組み込んだスマートカード（メモリカード、ICカード）に限定されるものではない。
すなわち、保安データストレージ（メモリ）の有無にかかわらず、本発明のプログラム検証装置はプログラムの検証を実行する装置に広く適用できるものである。
【００７６】
また、上記実施形態および具体例では、プログラムデータを保安データストレージに貯蔵する際に、プログラムデータにCRC演算を行って得た第1チェックサム値と保安データストレージに伝送されたプログラムデータにCRC演算を行って得た第2チェックサム値とを比較して両者の一致不一致に基づいてプログラム検証を実行する場合を例示したが、CRC演算結果の比較方法はこれに限定されない。
例えば、第1チェックサム値を求める代わりに予め計算済みのチェックコード（期待値）を用意しておく。そして、このチェックコードと第2チェックサム値とを比較するようにしてもよい。
【００７７】
上記実施形態では、プログラムデータを一時保持するバッファメモリとCRC演算結果を一時保持するレジスタ（CRCレジスタ）とは別個の回路とする場合を示したが、本発明のプログラム検証装置としては、これらメモリ機能部をまとめてプログラム検証に必要なデータを保持するデータ保持回路として備えていてもよい。
【符号の説明】
【００７８】
10…ループ回数信号、11…ループ回数設定信号、12…再実行信号、13…アドレス順序信号、14…データ順序信号、15…アドレス信号、16…リードデータ信号、17…演算データ信号、100…制御ユニット、110…ランダム遅延制御ロジック、120…バッファメモリ、130…データコピー及び制御ロジック、140…CRC演算ロジック、150…CRCレジスタ、160…比較器、171、172…レジスタ、180…訂正／検出制御ロジック、190…信号発生器、300…RAM、500…保安データストレージ、501…アレイ、504…ページバッファ、700…ループ回数ロジック、701…ループ回数カウンタ、702…ループ回数設定部、703…ループ回数判定回路、800…演算順序ロジック、801…演算順序設定部、802…アドレス生成回路、803…データ並び位置変更回路、910…実行制御ロジック。
【図１】
2010218237.tif 000003
【図２】
2010218237.tif 000004
【図３】
2010218237.tif 000005
【図４】
2010218237.tif 000006
【図５】
2010218237.tif 000007
【図６】
2010218237.tif 000008