(57)【特許請求の範囲】
【請求項１】
プロセッサ（４）で実行される情報処理プログラム内の命令シーケンス（Inst.１−Inst.ｎ）の実行順序を監視する方法であり、監視装置（２２）はそれにより実行される前記プロセッサに前記命令を伝送し、
該監視方法は、
前記監視装置によって、前記監視装置が前記プロセッサに伝送する各命令から取得されるデータを使用して検証値（VHｎ）を計算（４０、４２）すること、および、
前記監視装置によって、計算された前記検証値を所定の基準データ（Vref）と比較（５０）することからなり、
前記検証値の計算は、前記命令シーケンスの中の第１の命令から取得されるデータで始まり、前記命令シーケンスの中の最後の命令から取得されるデータで終了するものであり、
前記所定の基準データ（Vref）は、前記命令シーケンスの所定の実行順序に従って前記命令シーケンスの中の各命令のデータのみを使用して計算されているものであり、
前記検証値と前記所定の基準データの一致が、前記命令シーケンスの中の命令が他のいかなる命令の実行によっても割り込まれることなく前記所定の実行順序で実行されていることを示し、該２つの値の不一致がそれ以外を示しており、
前記計算された検証値と所定の基準データ（Vref）との比較（５０）が、前記プログラム内の所定の箇所に置かれた１つの命令（Inst.ｎ＋１）によって引き起こされ、この命令が前記所定の基準データを含んでいることを特徴とする、命令シーケンスの実行順序の監視方法。
【請求項２】
前記命令が１６進値または１０進値を用いてそれぞれコード化されており、前記検証値および前記所定の基準値の計算のために使用されるデータが１６進値または１０進値を含んでいることを特徴とする、請求項１に記載の監視方法。
【請求項３】
当該監視方法が、前記検証値と前記所定の基準データとの不一致がある場合に監視されているプログラムの実行に割り込むこと（５６）をさらに含むことを特徴とする、請求項１又は２に記載の監視方法。
【請求項４】
当該監視方法が、
前記検証値と前記所定の基準データの間の不一致の回数のカウントを保つこと、および、
前記不一致の回数が所定数に達した場合に前記情報処理プログラムの実行を禁止することをさらに含むことを特徴とする、請求項１から３のいずれか１つに記載の監視方法。
【請求項５】
前記命令シーケンスが、その予定されたランにおいてジャンプを含まないことを特徴とする、請求項１から４のいずれか１つに記載の監視方法。
【請求項６】
前記検証値を計算することが、一連の中間検証値を計算することを含んでおり、
該中間検証値のそれぞれは、前記命令シーケンスの中の一つの命令にそれぞれ対応しており、
該中間検証値のうち最後のものは、前記所定の基準データとの比較のために使用される、最終的な計算された検証値を構成することを特徴とする、請求項１から５のいずれか１つに記載の監視方法。
【請求項７】
前記一連の中間検証値の中のそれぞれの中間検証値（VHｎ）が、現在の中間検証値の計算の直前に計算されている、別の中間検証値（VHｎ−１）に基づいて計算されることを特徴とする、請求項６に記載の監視方法。
【請求項８】
現在の命令について中間検証値（VHｎ）を計算することが、
前記直前に計算された検証値（VHｎ−１）と前記現在の命令のデータに対してハッシュ関数ｆ（VHｎ−１，Vinst.ｎ）を適用することからなることを特徴とする、請求項７に記載の監視方法。
【請求項９】
前記データは演算コードおよびアドレスを含んでおり、
前記検証値を計算することが、該演算コードおよびアドレスに対する冗長計算を実行することから成ることを特徴とする、請求項１から７のいずれか１つに記載の監視方法。
【請求項１０】
プロセッサによって実行されるときに、情報処理プログラム内の命令シーケンス（Inst.１−Inst.ｎ）の実行の順序を監視するための装置であって、
該監視装置は、
該監視装置が前記プロセッサに伝送する各命令から取得されるデータを使用して検証値（VHｎ）を計算する（４０、４２）こと、および、
前記検証値を所定の基準データ（Vref）と比較する（５０）ことができるように適合化されており、
該検証値の計算は、前記命令シーケンスの中の第１の命令から取得されるデータで始まり、前記命令シーケンスの中の最後の命令から取得されるデータで終了するものであり、
前記所定の基準データ（Vref）は、前記命令シーケンスの所定の実行順序に従って前記命令シーケンスの中の各命令のデータのみを使用して計算されているものであり、
前記検証値と前記所定の基準データの一致が、前記命令シーケンスの中の命令が他のいかなる命令の実行によっても割り込まれることなく前記所定の実行順序で実行されることを示し、該２つの値の不一致がそれ以外を示しており、
前記監視装置が、中間検証値を計算するための計算機（２６）と、前記中間検証値（VH）を記憶するためのレジスタ（２４）とを備え、
該中間検証値のそれぞれは、前記命令シーケンスの中の一つの命令にそれぞれ対応しており、
該中間検証値のうち最後のものは、前記所定の基準データとの比較のために使用される、最終的な計算された検証値を構成することを特徴とする、監視装置。
【請求項１１】
前記レジスタ（２４）が前記情報処理プログラム内の一つの命令の制御下でリセットされることを特徴とする、請求項１０に記載の監視装置。
【請求項１２】
前記監視装置が、不一致が検出された回数のカウントを記憶するためのカウンタ（６０）をさらに備えることを特徴とする、請求項１０又は１１に記載の監視装置。
【請求項１３】
前記情報処理プログラムを記憶するための手段（２）、および、請求項１０から１２のいずれか１つに記載の監視装置を備えていることを特徴とする、プログラムされた装置。
【請求項１４】
前記情報処理プログラムを実行するためのプログラム実行装置であって、該プログラム実行装置が、
前記情報処理プログラムを記憶するための手段（２）と、
前記情報処理プログラムを実行するためのプロセッサ（４）と、
請求項１０から１２のいずれか１つに記載の監視装置とを備えていることを特徴とする、プログラム実行装置。
【請求項１５】
チップカードであることを特徴とする、請求項１３に記載のプログラムされた装置。
【請求項１６】
監視装置が、プログラム実行装置による命令シーケンス（Inst.１−Inst.ｎ）の実行を監視するための監視方法であって、
プログラム実行装置は命令レジスタおよびプロセッサを含み、
命令レジスタには情報処理プログラムが保存されており、
情報処理プログラムは命令シーケンス（Inst.１−Inst.ｎ）および基準値（Vref）を含み、
基準値は、後述の第1のステップにおいて、命令シーケンスに含まれる全ての命令（Inst.１−Inst.ｎ）が確実にプロセッサに伝送された場合に、後述の第２のステップにおける検証値と等しくなるように適合化されており、
監視装置は命令レジスタとプロセッサの間に配置されており、
監視装置はレジスタと計算機を含んでおり、
監視装置が以下の第1のステップ、および、その後に続く以下の第２のステップを実行することを特徴とする、監視装置によるプログラム実行監視方法。
・以下のサブステップ（Ａ１）−（Ａ４）を繰り返し実行する第１のステップ
（Ａ１）命令レジスタから命令を受信する、
（Ａ２）受信した命令の数値に対してハッシュ関数ｆ（VHｎ−１，Vinst.ｎ）計算を行う、
（Ａ３）レジスタの値を、該ハッシュ関数ｆ（VHｎ−１，Vinst.ｎ）計算によって得られた値で置き換える、
（Ａ４）受信した命令をプロセッサに伝送する、
・以下のサブステップ（Ｂ１）を実行する第２のステップ
（Ｂ１）前記基準値と、この時点におけるレジスタの値即ち検証値とを比較する。
【請求項１７】
監視装置が、プログラム実行装置による命令シーケンス（Inst.１−Inst.ｎ）の実行を監視するための監視方法であって、
プログラム実行装置は命令レジスタおよびプロセッサを含み、
命令レジスタには情報処理プログラムが保存されており、
情報処理プログラムは、命令シーケンス（Inst.１−Inst.ｎ）、第1の監視命令、および、第２の監視命令を含み、
第２の監視命令は基準値（Vref）を含み、
基準値は、後述の第1のステップにおいて、命令シーケンスに含まれる全ての命令（Inst.１−Inst.ｎ）が確実にプロセッサに伝送された場合に、後述の第２のステップにおける検証値と等しくなるように適合化されており、
監視装置は命令レジスタとプロセッサの間に配置されており、
監視装置はレジスタと計算機を含んでおり、
監視装置が以下の第1のステップおよび第２のステップを実行することを特徴とする、監視装置によるプログラム実行監視方法。
・監視装置が第１の監視命令を受信することによって引き起こされる、監視装置が第２の監視命令を受信するまでの間以下のサブステップ（Ａ１）−（Ａ４）を繰り返し実行する第１のステップ
（Ａ１）命令レジスタから命令を受信する、
（Ａ２）受信した命令の数値に対してハッシュ関数ｆ（VHｎ−１，Vinst.ｎ）計算を行う、
（Ａ３）レジスタの値を、該ハッシュ関数ｆ（VHｎ−１，Vinst.ｎ）計算によって得られた値で置き換える、
（Ａ４）受信した命令をプロセッサに伝送する、
・監視装置が第２の監視命令を受信することによって引き起こされる、以下のサブステップ（Ｂ１）−（Ｂ２）を実行する第２のステップ
（Ｂ１）第２の監視命令に含まれる基準値と、この時点におけるレジスタの値即ち検証値とを比較する、
（Ｂ２）前記比較において基準値と検証値が一致していない場合に、割込命令をプロセッサに伝送する。
【請求項１８】
プログラム実行装置による命令シーケンス（Inst.１−Inst.ｎ）の実行を監視するための監視装置であって、
監視装置はレジスタと計算機を含んでおり、
監視装置が以下の第１のデータ処理および第２のデータ処理を実行することができるように適合化されている事を特徴とする、監視装置。
・以下のサブ処理（Ａ１）−（Ａ４）を繰り返し実行する第1のデータ処理
（Ａ１）プログラム実行装置から命令を受信する、
（Ａ２）受信した命令の数値に対してハッシュ関数ｆ（VHｎ−１，Vinst.ｎ）計算を行う、
（Ａ３）レジスタの値を、該ハッシュ関数ｆ（VHｎ−１，Vinst.ｎ）計算によって得られた値で置き換える、
（Ａ４）受信した命令をプログラム実行装置に伝送する、
・以下のサブ処理（Ｂ１）を実行する第２のデータ処理
（Ｂ１）プログラム実行装置から受信した基準値と、この時点におけるレジスタの値即ち検証値とを比較する。
【請求項１９】
プログラム実行装置による命令シーケンス（Inst.１−Inst.ｎ）の実行を監視するための監視装置であって、
監視装置はレジスタと計算機を含んでおり、
監視装置が以下の第１のデータ処理および第２のデータ処理を実行することができるように適合化されている事を特徴とする、監視装置。
・第1の監視命令を受信することによって引き起こされる、第２の監視命令を受信するまで以下のサブ処理（Ａ１）−（Ａ４）を繰り返し実行する第1のデータ処理
（Ａ１）プログラム実行装置から命令を受信する、
（Ａ２）受信した命令の数値に対してハッシュ関数ｆ（VHｎ−１，Vinst.ｎ）計算を行う、
（Ａ３）レジスタの値を、該ハッシュ関数ｆ（VHｎ−１，Vinst.ｎ）計算によって得られた値で置き換える、
（Ａ４）受信した命令をプログラム実行装置に伝送する、
・第２の監視命令を受信することによって引き起こされる、以下のサブ処理（Ｂ１）−（Ｂ２）を実行する第２のデータ処理
（Ｂ１）第２の監視命令に含まれる基準値と、この時点におけるレジスタの値即ち検証値とを比較する、
（Ｂ２）前記比較処理において基準値と検証値が一致していない場合に、割込命令をプログラム実行装置に伝送する。
【請求項２０】
レジスタおよびプロセッサを有するプログラム実行装置であって、請求項１８又は１９の監視装置が前記レジスタと前記プロセッサとの間に配置されていることを特徴とする、プログラム実行装置。
【請求項２１】
プログラムされた装置に内蔵された監視装置が、プログラム実行装置による命令シーケンス（Inst.１−Inst.ｎ）の実行を監視するための監視方法であって、
プログラム実行装置はプロセッサを含み、
プログラムされた装置は前記監視装置およびメモリを含み、
該メモリには情報処理プログラムおよび基準値（Vref）が保存されており、
情報処理プログラムは、命令シーケンス（Inst.１−Inst.ｎ）を含み、
基準値は、後述の第1のステップにおいて、命令シーケンスに含まれる全ての命令（Inst.１−Inst.ｎ）が確実にプログラム実行装置に伝送された場合に、後述の第２のステップにおける検証値と等しくなるように適合化されており、
監視装置はレジスタと計算機を含んでおり、
監視装置が以下の第1のステップ、および、その後に続く以下の第２のステップを実行することを特徴とする、プログラムされた装置に内蔵された監視装置によるプログラム実行監視方法。
・以下のサブステップ（Ａ１）−（Ａ４）を繰り返し実行する第１のステップ
（Ａ１）前記メモリから命令を受信する、
（Ａ２）受信した命令の数値に対してハッシュ関数ｆ（VHｎ−１，Vinst.ｎ）計算を行う、
（Ａ３）レジスタの値を、該ハッシュ関数ｆ（VHｎ−１，Vinst.ｎ）計算によって得られた値で置き換える、
（Ａ４）受信した命令をプログラム実行装置に伝送する、
・以下のサブステップ（Ｂ１）を実行する第２のステップ
（Ｂ１）前記基準値と、この時点におけるレジスタの値即ち検証値とを比較する。
【請求項２２】
プログラムされた装置に内蔵された監視装置が、プログラム実行装置による命令シーケンス（Inst.１−Inst.ｎ）の実行を監視するための監視方法であって、
プログラム実行装置はプロセッサを含み、
プログラムされた装置は前記監視装置およびメモリを含み、
該メモリには情報処理プログラムが保存されており、
情報処理プログラムは、命令シーケンス（Inst.１−Inst.ｎ）、第1の監視命令、および、第２の監視命令を含み、
第２の監視命令は基準値（Vref）を含み、
該基準値は、後述の第1のステップにおいて、命令シーケンスに含まれる全ての命令（Inst.１−Inst.ｎ）が確実にプログラム実行装置に伝送された場合に、後述の第２のステップにおける検証値と等しくなるように適合化されており、
監視装置はレジスタと計算機を含んでおり、
監視装置が以下の第1のステップおよび第２のステップを実行することを特徴とする、プログラムされた装置に内蔵された監視装置によるプログラム実行監視方法。
・監視装置が第１の監視命令を受信することによって引き起こされる、監視装置が第２の監視命令を受信するまでの間以下のサブステップ（Ａ１）−（Ａ４）を繰り返し実行する第１のステップ
（Ａ１）前記メモリから命令を受信する、
（Ａ２）受信した命令の数値に対してハッシュ関数ｆ（VHｎ−１，Vinst.ｎ）計算を行う、
（Ａ３）レジスタの値を、該ハッシュ関数ｆ（VHｎ−１，Vinst.ｎ）計算によって得られた値で置き換える、
（Ａ４）受信した命令をプログラム実行装置に伝送する、
・監視装置が第２の監視命令を受信することによって引き起こされる、以下のサブステップ（Ｂ１）−（Ｂ２）を実行する第２のステップ
（Ｂ１）第２の監視命令に含まれる基準値と、この時点におけるレジスタの値即ち検証値とを比較する、
（Ｂ２）前記比較において基準値と検証値が一致していない場合に、割込命令をプログラム実行装置に伝送する。
【請求項２３】
前記プログラムされた装置とはチップカードであることを特徴とする、請求項２１又は２２に記載の監視方法。
【請求項２４】
プログラム実行装置による命令シーケンス（Inst.１−Inst.ｎ）の実行を監視するための監視装置が内蔵されている、プログラムされた装置であって、
プログラムされた装置は前記監視装置およびメモリを含み、
該メモリには情報処理プログラムおよび基準値が保存されており、
情報処理プログラムは、命令シーケンス（Inst.１−Inst.ｎ）を含み、
基準値は、後述の第1のデータ処理において、命令シーケンスに含まれる全ての命令（Inst.１−Inst.ｎ）が確実にプログラム実行装置に伝送された場合に、後述の第２のデータ処理における検証値と等しくなるように適合化されており、
監視装置はレジスタと計算機を含んでおり、
監視装置が以下の第１のデータ処理および第２のデータ処理を実行することができるように適合化されている事を特徴とする、プログラムされた装置。
・以下のサブ処理（Ａ１）−（Ａ４）を繰り返し実行する第1のデータ処理
（Ａ１）前記メモリから命令を受信する、
（Ａ２）受信した命令の数値に対してハッシュ関数ｆ（VHｎ−１，Vinst.ｎ）計算を行う、
（Ａ３）レジスタの値を、該ハッシュ関数ｆ（VHｎ−１，Vinst.ｎ）計算によって得られた値で置き換える、
（Ａ４）受信した命令をプログラム実行装置に伝送する、
・以下のサブ処理（Ｂ１）を実行する第２のデータ処理
（Ｂ１）前記基準値と、この時点におけるレジスタの値即ち検証値とを比較する。
【請求項２５】
プログラム実行装置による命令シーケンス（Inst.１−Inst.ｎ）の実行を監視するための監視装置が内蔵されている、プログラムされた装置であって、
プログラムされた装置は前記監視装置およびメモリを含み、
該メモリには情報処理プログラムが保存されており、
情報処理プログラムは、命令シーケンス（Inst.１−Inst.ｎ）、第１の監視命令、および、第２の監視命令を含み、
第２の監視命令は基準値を含み、
該基準値は、後述の第1のデータ処理において、命令シーケンスに含まれる全ての命令（Inst.１−Inst.ｎ）が確実にプログラム実行装置に伝送された場合に、後述の第２のデータ処理における検証値と等しくなるように適合化されており、
該監視装置はレジスタと計算機を含んでおり、
該監視装置が以下の第１のデータ処理および第２のデータ処理を実行することができるように適合化されている事を特徴とする、プログラムされた装置。
・監視装置が第1の監視命令を受信することによって引き起こされる、監視装置が第２の監視命令を受信するまで以下のサブ処理（Ａ１）−（Ａ４）を繰り返し実行する第1のデータ処理
（Ａ１）前記メモリから命令を受信する、
（Ａ２）受信した命令の数値に対してハッシュ関数ｆ（VHｎ−１，Vinst.ｎ）計算を行う、
（Ａ３）レジスタの値を、該ハッシュ関数ｆ（VHｎ−１，Vinst.ｎ）計算によって得られた値で置き換える、
（Ａ４）受信した命令をプログラム実行装置に伝送する、
・監視装置が第２の監視命令を受信することによって引き起こされる、以下のサブ処理（Ｂ１）−（Ｂ２）を実行する第２のデータ処理
（Ｂ１）第２の監視命令に含まれる基準値と、この時点におけるレジスタの値即ち検証値とを比較する、
（Ｂ２）前記比較処理において基準値と検証値が一致していない場合に、割込命令をプログラム実行装置に伝送する。
【請求項２６】
チップカードであることを特徴とする、請求項２４又は２５に記載のプログラムされた装置。
【発明の詳細な説明】
【０００１】
本発明は、情報処理プログラムのセキュリティの分野、特に情報処理プログラムの実行において容認できないランを検知する方法および装置に関するものであり、該プログラムは、低級または高級言語によるものであることができる。
【０００２】
低級言語で書かれるプログラムでは、コンピュータのプロセッサ部分で実際に実行される命令の構造に非常に近い構造によって、コマンドが作成される。プログラムは、実行される前に、コンパイルされることだけが必要となる。低級言語は、機械コードの呼称で知られているが、特にマイクロプロセッサまたはマイクロコントローラのプログラミングのために用いられる。マイクロコントローラは、少数の特殊な命令のみ実行することのできるプロセッサである。それは、特にチップカード（銀行、電話、サービスへのアクセス等のカード）を装備するために、そして工業的な又は家庭の機器を操作するために用いられる。
【０００３】
高級言語で書かれるプログラムでは、コマンドは自然言語にはより近いが、その代わりプロセッサによって用いられる構造とは遠い構造を有する。このような言語で書かれたコマンドは、まず翻訳され、つまり機械コードのコマンドに変換されてから、次にプロセッサにより実行される命令形式にすることができる。
【０００４】
このように、あらゆる情報処理プログラムによって、特定のプロセッサ、マイクロプロセッサ、またはマイクロコントローラに適した一連の命令が行われる。
【０００５】
従来的には、図１を参照して簡潔に記載されるように、プログラムの命令は、命令カウンタによって規定されるシーケンスに従って、プロセッサによって実行される。
【０００６】
プログラムの、コンパイルされた命令は、連続する命令Inst.１，Inst.２，Inst.３，…，Inst.（ｎは整数である）のブロックで、コードまたはマイクロコードの形式で命令レジスタ２にロードされる。それぞれの命令は、このレジスタ２における特別なアドレスによって識別される。例では、命令Inst.１，Inst.２，Inst.３，…，Inst.ｎのアドレスが、それぞれAd.１，Ad.２，Ad.３，…Ad.ｎと示されている。命令は、命令レジスタ２から読み取られ、続いてプロセッサ４にロードされ、そこで、プロセッサ４によって制御される命令カウンタ６のコマンドの下で実行される。このため、命令カウンタ６は、アドレスポインタ８を有し、該アドレスポインタは、レジスタ２のアドレスAd.１，…Ad.ｎを指し、該アドレスから、１つの命令シーケンスの実行中にプロセッサ４にロードすべき命令を読み取る。従って、ポインタ８の、命令レジスタ２のアドレスに対する位置は、命令の実行に応じて変化する。
【０００７】
図１に示されている例では、レジスタ２内の命令、Inst.１，Inst.２，Inst.３，…，Inst.ｎは、最初の命令Inst.１からｎ番目の命令Inst.ｎまで連続して、すなわち、線形に実行されなければならない。従って、命令カウンタ６のポインタ８は、レジスタ２のアドレスAd.１を最初に指定し、それから対応する命令Inst.１のデータ１０−１が、プロセッサ４にロードされる。プロセッサ４が、命令カウンタ６に、次の命令（この場合、Inst.２）を与えるように命令すると、該命令カウンタは、アドレスAd.２を指定するために、ポインタ８の位置を、アドレス移動の１単位分インクリメントする。このプロセスは繰り返され、最後の命令Inst.ｎのデータ１０−ｎをロードするために（点線）、ポインタ８がアドレスAd.ｎを指定すると終了する。
【０００８】
線形に実行される一連の命令は、連続するアドレスに対応するポインタ８のシーケンシャルな移動から外れる “ジャンプ”を有さない。これは、例えば、次のようなマイクロコードでの命令シーケンスでの場合である。
lda      t
txa
mul
bset    3,t
sta      n
【０００９】
言いかえれば、このシーケンスは線形に実行され、命令カウンタ６は、１つの命令から別の命令へ移行する際に、アドレスの移動の１単位分をインクリメントする。
【００１０】
しかしながら、プログラムの実行が、レジスタ２内に在る命令の線形シーケンスの外にある命令へのジャンプを要することはよくあることである。このようなジャンプは、シーケンスの外にあるアドレスに位置するデータのロード命令、または次のコマンドを条件に従って実行する、いわゆる分岐命令に起因することがあり得る。
【００１１】
ジャンプを引き起こす命令は、命令カウンタ６のところで、このジャンプに続く次の命令の、レジスタ２におけるアドレスを決定し、そこにある命令またはデータをプロセッサ４にロードするように、ポインタ８がこのアドレスを指すことを要する。
【００１２】
例として、以下のシーケンスは、コメント“ジャンプ”に対応するコードの箇所において、命令カウンタ６への、新しい値のロードを引き起こす。
lda
txa
bra    ラベル；ジャンプ
mul
bset    3,t
sta    n
ラベル      rts
【００１３】
このように一連のシーケンシャルなアドレスの外にあるアドレスへジャンプするコマンドの下で実行できることによって、不幸なことに、プログラムの容認できないランが起こり得る。このようなプログラムの容認できないランは、プログラムされた装置の事故的な作動不良に起因し得る。しかし、それは、望まれる機能がプログラムされた装置の作動を、不正に使用することをねらった悪意のあるアクションによっても起こり得る。例えば、チップカードの場合、ジャンプおよび／または分岐の作成あるいは変更によって、マイクロコントローラのプログラミングを変更することにより、間違ったデータ（銀行または電話カードで許可された予算の増額、あるサービスへの偽のアクセス許可等）をロードすること、または、メモリに保存されている機密データ（アクセスコード、カードの名義人に関する個人的な情報等）を奪取することが可能となる。
【００１４】
実際、プログラムが、半導体チップに固定された状態で記録されているときでさえも、プローブおよび部品のテストの現状技術を用いて、集束イオンビーム（英語での“Focus  Ion  Beams”または“FIBs”の名称の下でも知られている）の作業ステーションによって、チップの表面に（または、その下側の相においても）プローブ接触部を作ることが可能である。
【００１５】
これらのプローブ点が一度作られると、ビットを連続して読み取る（かつ、時間とともにその移動に付随し）、またはその値の外部変更を可能にする、特別な台（英語での “probe  stations（プローブステーション）”という名称の下でも知られている）によって、プローブ先端を置くことが可能になる。
【００１６】
特に、命令カウンタ６のレジスタ上への接触部の設置は、実行中のレジスタの値を外部からロードすることを可能にし、かつプログラムの設計者が想定していない分岐を引き起こすことを可能にする。上記において説明されたように、このようなジャンプは、当然、実施のセキュリティに対して有害な影響を与え、そして、例えば不完全に計算を行うことによって秘密データの漏洩に至ることがあり得る。
【００１７】
また、より初歩的で、しかし確実さに劣る方法も存在するが、それは、プログラムのランにおいて作動不良を引き起こす。１つの例が、R.Andersonによる“Tamper−resistance,  a  cautionary  note”と題された記事において与えられている。１つの別の技術は、秘密鍵のようなデータをチップカードから引き出すために故意になされる計算誤りを利用することから成る。この技術は、１９９６年１０月３１日に出版されたBellcore  Reportの、Boneh、DeMillo、およびLiptonによる“On  the  Importance  of  Checking  Computations”と題された記事に記載されている。
【００１８】
当然ながら、攻撃されるプログラムがコンパイルされる代わりに翻訳される際にもまた、同じ現象が起こりうる。従って、攻撃者が、例えば、翻訳すべきカレント命令を指す、インタープリタのプログラムポインタを変更するのに成功した場合、Java（登録商標）またはBasic言語によるアプリケーションは、その正当な使用から逸脱させることが可能となる。
【００１９】
ところで、現在の情報処理システムは、コードの内部での制御されない分岐を禁ずるように特別に設計されているわけではない。むしろその反対で、アセンブリ言語は、プログラマに最大限の自由を与えるように特別に設計されているのである。例として、C言語では、ポインタによってインデックス修飾される実行を用いることで、１つの関数のコード内でジャンプすることが可能である。
【００２０】
原因が、不都合な作動不良であるにしろ、想定されたその使用からプログラムを不正に使用する意志であるにしろ、容認できないようなプログラムのランのこれらの問題に対して、本発明は、情報処理プログラムの一続きの命令を実行するランの監視方法を提案するものであり、監視されるプログラムを実行するためのプロセッサに伝送される命令シーケンスを分析することと、前記プログラムによって記録される基準データでこの分析結果を検証することから成る。
【００２１】
このように、本発明は、対象となる命令セットに含まれる全ての命令が、それらを実行するために、確実にプロセッサに伝送されたことを検証することを可能にする。その場合、このように読み取られた命令は、実行もされたと仮定する。
【００２２】
基準データは、例えば前もって規定された値であることができ、該値は、プログラムのランの際に命令シーケンスの全ての命令が実際に分析された場合にのみ、監視方法実施の際に実現される分析結果に対応するものである。
【００２３】
好ましくは、分析のステップは、プロセッサへ伝送された各命令からデータを抽出するサブステップと、このように抽出された各データについて所定の計算をするサブステップとを含み、検証ステップは、分析結果を基準データと比較する。
【００２４】
有利には、検証ステップは、監視手段に接続されたレジスタに保存されている値と基準値とを、固定プログラム方式で比較することで実行され、該基準値は、監視プログラムを構成するコードをマスキングする際に１度だけ固められる布線式プログラムに（例えば、ROMタイプの固定メモリに）書き込まれることができる。
【００２５】
好ましくは、検証は、プログラム内の所定の場所に置かれた１つの命令によって引き起こされ、この命令は、先に引用された基準データを含んでいる。
【００２６】
有利には、監視すべき命令セットの命令が、１６進法または１０進法の１つの値の形式で存在するとき、前述された分析の際には、単なる数値としてこれらの命令が処理される。
【００２７】
情報処理プログラムの命令シーケンスの実行を監視するグローバルな方法は、このように、以下のステップを含むことができる。
−プログラムを作成する際
−監視すべき各命令において識別可能なデータに適用される所定の規則に従って規定された基準値を、プログラムの１つの命令シーケンスの少なくとも１つの所定の箇所に挿入し、
−監視すべきプログラムの部分を実行する際
−実行される各命令において識別可能な前記データを取得し、
−このように得られた前記の識別可能なデータに、前記の所定の規則を適用して、検証値を規定し、
−この検証値が、プログラムと共に記録されている基準値に実際に対応することを検証する。
【００２８】
本発明の好適な実施態様では、検証値が基準値に対応しないことが検知された際に、プログラムのランを中断することにする。この割込みは、検証値と基準値との間での不一致が所定の回数検知された場合に、監視されている情報処理プログラムを備えた装置の今後の使用を無効にするアクションを伴うことができる。
【００２９】
有利には、監視すべき命令セットは、予定されているランにおいてジャンプを有さず、それが有する全ての命令が、対象となる全ての場合において実行されるよう期待される。
【００３０】
監視すべきプログラムまたはプログラムの部分が、少なくとも１回のジャンプを備えているとき、ジャンプを含まない命令セットに別々に監視方法を実施することが可能である。
【００３１】
処理されるデータに依存するジャンプ、つまり条件分岐を少なくとも１回引き起こす命令の場合は、ジャンプの前にあるジャンプの無い命令セットと、このジャンプの後にくるジャンプの無い少なくとも一つの命令セットとに対して、別々に監視方法を実施することができる。
【００３２】
この場合、ジャンプの前にある命令セットについて、この命令セットの検証値を得ようとする分析のためには、ジャンプをコマンドする命令（この命令は通常、分岐前の最後のものである）をこのセットに挿入し、従って、この命令セットの良好なランを検証してから、ジャンプの命令を実行するように計画することができる。
【００３３】
有利には、新たに方法を実施するたびに、前回、方法を実施した際に得られた検証値を消去する。この措置によって、ジャンプによって分離されている命令セットのような、１つのプログラムの様々な命令セットの監視を容易に管理することが可能になる。それは、特に、ジャンプによって分離されている様々なセットについて、検証値の計算と同じ初期条件で方法を実施することを可能にする。
【００３４】
新たに方法を実施するたびに、検証値は、単にゼロへリセットすることによって消去することができる。この値は、別の所定の初期値によって置き換えることもできる。ゼロへのリセット、あるいは初期化のこれらの演算は、保護されたソフトウェアによってアクティブにすることができる。
【００３５】
有利には、検証値は、一連の値の最後の値として得られ、該一連の値とは、命令セットの対象となる命令のそれぞれの分析とともに連続的に進行するものである。この取組み方は、監視方法のランの内部状態を含み、その進行に付随することを可能にする。
【００３６】
好ましくは、検証値のこの進行を可能にする分析態様は、先行する命令に続く対象となる各命令について対象となる命令から抽出された値と、この先行する命令において実施された同じ演算によって得られた結果とについて、同時に演算結果を計算することから成る。検証すべき第１の命令に関する計算については、この第１の命令から抽出されたデータと、所定の値（ここで、先に引用された再初期化またはゼロへのリセットの値に対応することのできる）とについて、同時に演算を実施することができ、該所定の値は、先行する演算結果が存在しない場合に“種”の値の役割を果たす。
【００３７】
このようにして、対象となる命令のそれぞれから抽出されたデータについて、同じように適用される再帰的アルゴリズム用いることによって、正しい検証値を得ることが可能となる。そのうえ、計算の演算は、一つには、計算の際に全ての命令のデータが対象となった場合、あるいは該データが予定された順序で対象となった場合にのみ、正しい検証値が得られるように、容易に選択することができる。
【００３８】
計算の演算は、ハッシュの連邦規格によって規定されたハッシュ関数SHA-1などの、データの暗号化の分野で周知の技術により、ハッシュ関数を適用することから成ることができる。この場合、演算コード（数値として考えられる）と、最後に行われた初期化以来実行されたアドレスとの全体を、暗号方式的にハッシングすることによって、監視方法のランの、前述の内部進行を実現することが可能である。
【００３９】
変型において、演算コードと、最後に行われた初期化以来実行されたアドレスとの全体について、必ずしも暗号化ではない冗長計算を行うことによって、検証値を進行させることが可能である。例として、CRC（英語でcyclic  redundancy  check（巡回冗長検査））タイプのアルゴリズムを用いることができる。
【００４０】
本発明によって、それぞれの命令に含まれるデータが、それらの実行の間に得られるに従って、中間値の計算により比較値を得ることが可能となる。この取組み方では、対象となる命令セットの命令から抽出されるそれぞれの値は、バックアップする必要がない。実際、中間値の計算の後では、次の中間値を計算するためにこの中間値（あるいは、検証値に対応する最終値）のみが重要となり、それを生成させるデータは、もはや考慮に入れられるものではない。この措置によって、本発明の実施手段におけるメモリスペースを節約することができる。
【００４１】
変型では、対象となる命令セットの命令に含まれているそれぞれのデータは、それらが実行されるのに従ってバックアップすることができ、例えば、検証ステップのなどの必要なときにのみ、検証値の計算を行うことが可能である。
【００４２】
本発明は、また、情報処理プログラムの一続きの命令の実行のランの監視装置に関するものであり、監視されるプログラムを実行するためのプロセッサに伝送された命令シーケンスを分析するための手段と、前記プログラムと共に記録されている基準データでこの分析結果を検証するための手段とを有することを特徴とする。
【００４３】
本発明に合致する監視装置は、有利には、検証値の計算において中間結果を記録することができるレジスタを有する。このレジスタは、途中の最後の中間結果のみを取っておくのに適することができる。
【００４４】
実行中のプログラムのコマンドの下、所定の値の記録またはゼロへのリセットを可能にすることができる。このようにして、プログラムは、監視方法を新たに実施するたびに、レジスタの内容における初期条件をコマンドすることができるが、ここでいう実施は、例えばプログラム内でのジャンプの後に発生するものである。
【００４５】
監視装置は、監視すべきプログラムの実行装置内に、または監視すべきプログラムを含むプログラムされた装置内に、内蔵することができる。
【００４６】
また、本発明は、プログラム実行装置、例えば、コンピュータ、チップカードまたはPCMCIAサイズのカードに記録されたプログラムの読取り装置のようなマイクロプロセッサまたはマイクロコントローラ機器などの、情報処理プログラムの一続きの命令を実行するためのものに関し、実行するために伝送された命令シーケンスを分析するための手段と、プログラムと共に記録されている基準データでこの分析結果を検証するための手段とを有することを特徴とする。
【００４７】
また、本発明は、前述のプログラム実行装置と共に機能するための、一続きの命令を有するプログラムされた装置にも関するものであり、さらに、基準データを有し、該基準データは、前記の命令の中に含まれるデータに応じて前もって規定され、かつ前述のプログラム実行装置によって分析される命令シーケンスの検証を可能にするものであることを特徴とする。
【００４８】
プログラムされた装置、例えば、チップカード、またはABSのブレーキシステムのようなメカニズムの制御機構は、監視すべきプログラムを、ROMタイプの固定メモリに内蔵することができる。
【００４９】
有利には、基準データは、コードをマスキングする際に一度だけ、布線式の固められた値の形式で、メモリに記録される。
【００５０】
また、本発明は、前述のプログラムされた装置と関連して機能するためのプログラムの実行装置のプログラミング装置に関し、プログラムの命令シーケンスの少なくとも１つの所定の箇所に、実行を監視することが望まれる命令セットのそれぞれの命令に含まれるデータから、前もって規定された態様に従って計算される基準値を書き込む手段を有することを特徴とする。
【００５１】
最後に、本発明は、クリティカルコードを翻訳する仮想マシンまたはインタープリタにも関し、クリティカルコードを実行するために、上述の監視方法を実施することを特徴とする。
【００５２】
監視、プログラム実行、またはプログラミングの前述の装置、さらにはこのようなプログラムを備える装置は、必要となる全ての手段を備え、前述の監視方法の様々な可能なオプションの局面を実現することができる。
【００５３】
例として、チップカードに関する応用において、プログラムを実行するマイクロプロセッサに、監視ユニットの役割を果たす追加の物的な要素を加えることを考えることができる。このユニットの役割は、ソフトウェアの設計者が想定していないジャンプが、実行中に起こり得ないことを監視することである。この例では、監視ユニットは、レジスタから成ることができ、該レジスタの内容は、監視ユニットの内部状態を常に形成する。監視ユニットの特殊な入力は、典型的には、監視ユニットの内容を消去することによって、そのゼロへのリセット（RAZ）を可能にする。この機能は、実行されるソフトウェアによって常にアクティブにすることができ、例えば、アセンブラで書かれた新規の演算コード（例えば、“clr  us”）を加えることによって、または、保護された要素のメモリ内のある１ビットを処理することによって（例えば：setb  3，SERVICE）、実現することができる。
【００５４】
この応用例では、監視ユニットは、その内部状態を、保護されたソフトウェアによって与えられるデータストリングと比較する。それは、例えば、ソフトウェアが内部状態を比較することを望む値を、監視ユニットの内部で（ループ“lda-sta”によって）コピーすることによって実現することができる。値のコピーが一旦終了すると、監視ユニットは、それを、その内部状態と比較し、次の動作を採用する：監視ユニットの状態が、保護されているソフトウェアによって示される値に等しい場合、正常に実行を再開し、そうでなければ、プログラムの実行は停止されるが（ユーザーにカードをゼロにリセットをさせるよう強制する）、この場合、虚偽実行カウンタを前もって認めておくこともあり、該カウンタは、値が適切な限度（例えば４）を超える場合にカードを決定的にブロックするEEPROMタイプの不揮発性メモリ内にある。
【００５５】
監視ユニットは、その最後にゼロにリセットして以来に実行された、命令コードおよびアドレスを暗号方式的にハッシングしたものを、恒久的に保存することができる。
【００５６】
監視のメカニズムは、仮想マシンにおけるコード（例えば、Java（登録商標）の“byte  code（バイトコード）”）の翻訳に適することができる。コンパイラは、バイトコードの一部分のハッシュ値を計算し、それを英語で“class  file（クラスファイル）”として知られているある属性の構造に入れ込み、発生したバイトコードに、監視ユニットのゼロへのリセットおよび検証機能の呼び出しに対応する、英語で“opcodes（命令コード）”として知られている補足的なコードを加えることができる。仮想マシンは、監視ユニットの代わりをし、それが検証の命令コードに遭遇したとき、クラスファイルに含まれる理論的なハッシュ値と、カレントのハッシュ値とを検証することになる。
【００５７】
本発明は、付属の図面を参照して、純粋に例として挙げられた、好適実施態様の以下の説明を読むことによって、より明確に、利点および特徴が理解されるだろう。
−図１は、すでに紹介されたが、プログラムの実行のランにおいて命令カウンタの役割を説明することを目的とする、単純化されたブロック図である。
−図２は、本発明の第１の実施態様に合致する監視ユニットの作動原理を説明することをねらいとする、プログラム実行装置の単純化されたブロック図である。
−図３は、本発明による、監視方法のフローチャートである。
−図４は、本発明による、監視方法の変型のフローチャートである。
−図５は、本発明の第２の実施態様に合致する監視ユニットの作動原理を説明することをねらいとする、プログラム実行装置の単純化されたブロック図である。
−図６は、第２の実施態様に適した、本発明による監視方法のフローチャートである。
−図７は、監視方法に特有の命令をさらに含む分岐のある１つのプログラムの命令セットを簡略化して示している。
【００５８】
本発明の原理は、図２のブロック図を参照して説明されるが、図１のブロックと類似の役割を有するブロックには同じ参照番号がつけられ、簡潔さをはかるために、新たに説明はしない。
【００５９】
図２は、広い意味でのプログラム実行装置２０の基本要素を表している。それは、高級言語で書かれたプログラムを実行するためのコンピュータ、又はマイクロプロセッサ、あるいはマイクロコントローラであることが可能であるが、後ろの二つは低級言語で書かれたプログラムから作動する。例として、実行装置２０は、銀行、電話、または他のサービスの取引を管理するためのチップカードの読取り装置であることができる。そして、検証すべきプログラムは、チップカードの中に物的に保存されている。
【００６０】
続く説明を具体的にするために、プログラム実行装置２０は、マイクロコントローラタイプのプロセッサ４に基づくことと仮定する。
【００６１】
プロセッサ４は、マイクロコードの形で命令レジスタ２に保存されているプログラムの一部分を実行する。このプログラムの部分での実際に作動する部分は、Inst.１，Inst.２，Inst.３，…，Inst.ｎでそれぞれ示されるｎ個の命令（ｎは１より大きい整数である）から成る１つのシーケンスを有する。命令を構成するマイクロコードは、１０進法または１６進法であることのできる数値の形で存在する。
【００６２】
このような値は、２つの異なる形で考えることができるが、それぞれは、データを次のものとして所持する：第１には、プロセッサに対して示す命令として（その場合、それは“コード値”と示される）、第２に、算術処理がされる単なる数値としてである（この場合、それは、“数値”Vinst.と示される）。例えば、第１の命令Inst.１は４０に等しい。この数字は、プロセッサによって認知される１つの命令に対応するコードであるが、数値４０と同じ２進法構造をもっている。
【００６３】
命令Inst.１，Inst.２，Inst.３，…，Inst.ｎのうちのいかなるものも、命令実行の線形シーケンス外にある別の命令へのジャンプを命令しない。このように、この部分のプログラムの正常かつ予定されたランは、命令Inst.１から始まり、命令Inst.ｎで終わるように、連続してそれぞれの命令を実行することを必然的に要する。そのように、命令カウンタ６（既に記載）のそのポインタ８は、命令レジスタ２内の命令Inst.１からInst.ｎが、プロセッサ４にロードされるのに応じて逐次的に、それらの各アドレスを指す。
【００６４】
本発明に従って、プログラム実行装置２０は、監視ユニット２２を有し、該監視ユニットは、Inst.１からInst.ｎまでのそれぞれの命令が、それらの実行のためにプロセッサ４に確実にロードされたことを検証することを可能にする。それは、機能的には、命令レジスタ２とプロセッサ４との間に接続されている。このように、命令レジスタ２から読み取られる全ての命令は、監視ユニット２２を通ってから、プロセッサ４に達する。
【００６５】
この例では、監視ユニット２２は、プログラム実行装置２０に内蔵されているように記載されている。しかしながら、監視ユニット２２は、監視すべきプログラムを有する装置と共に、チップカードの中に例えば埋めこまれつつ内蔵されることももちろん可能であり、ここで、チップカードの監視すべきプログラムはメモリに保存されているが、そのことによって、以下に記載される原理が変わることはない。
【００６６】
後により詳細に説明されるように、監視ユニット２２は、命令Inst.１，Inst.２，Inst.３，…，Inst.ｎに含まれるデータを一時的に保存するためのレジスタ２４と、このデータについて演算を実行するための計算機２６とを有する。
【００６７】
監視ユニットの実施は、プログラムのｎ個の命令、Inst.１，Inst.２，Inst.３，…，Inst.ｎに、新規の２つの命令を付加することを要求する：プログラムの第１の命令Inst.１の前に置かれる第１の監視命令Inst.０、およびプログラムの最後の命令Inst.ｎの後に置かれる第２の監視命令Inst.ｎ＋１。
【００６８】
プログラムのｎ個の命令の実行のランのとき、命令カウンタ６は、最初に、そのポインタ８を、第１の監視命令Inst.０のアドレスを指すようにコマンドする。この命令は、監視ユニットが、そのレジスタ２４に含まれるハッシュ値VHを初期化するようコマンドする。例では、命令Inst.０は、単に、レジスタ２４に値VH＝０を置くようにコマンドする。それは、プロセッサ４には伝送されない。
【００６９】
続いて、プログラム実行装置２０は、プログラムの命令、Inst.１，Inst.２，Inst.３，…，Inst.ｎの本来の実行の段階に移る。命令レジスタ２から読み取られたそれぞれの命令は、最初に監視ユニット２２に伝送され、そこでは、それを数値とみなす。
【００７０】
それぞれの命令の数値に対しては、計算機２６によって、ハッシュアルゴリズムを適用するが、それは例えば、ハッシュの連邦規格によって明示されているハッシュSHA-１である。命令Inst.i（iは１からｎまでの整数）に関するハッシュ演算の結果VHiは、レジスタ２４に書き込まれる。
【００７１】
この値VHiは、次の命令Inst.i＋１でのハッシュ演算のためのベースとなる。次に、命令Inst.i＋１について、このようにして得られたハッシュ結果VHi＋１は、先に得られたハッシュ結果VHiと入れ代わって書き込まれる。
【００７２】
この手続きは、監視ユニット２２を通過するそれぞれの命令、Inst.１，Inst.２，Inst.３，…，Inst.ｎごとに続けられる。
【００７３】
最後の命令Inst.ｎが実行されたとき、第２の監視命令Inst.ｎ＋１は、監視ユニット２２にロードされる。この命令は２つの要素を有する：基準値Vref、およびこの基準値Vrefとレジスタ２４に登録された最後のハッシュ結果の値とを比較する計算機２６に向けられたコマンド。後者の値は、ハッシュ結果VHｎに対応し、該結果は、命令Inst.ｎの数値（図では３６に等しい）から、および前の命令Inst.ｎ−１について得られたハッシュ結果VHｎ−１から得られる。
【００７４】
このように、第２の監視命令Inst.ｎ＋１への応答として、計算機２６は、レジスタ２２内の値VHｎを、この監視命令において特別な基準値Vrefと比較する。
【００７５】
基準値Vrefは、記録されるプログラムを作成する際に、命令、Inst.１，Inst.２，Inst.３，…，Inst.ｎの値の連続的なハッシュ結果について期待される値VHｎに対応するように、決定される。この値Vrefは、監視ユニット２２によって用いられるのと同じ手続き、つまり命令、Inst.１，Inst.２，Inst.３，…，Inst.ｎの連続的なハッシュ手続きを用いて、前もって計算することができる。
【００７６】
好ましくは、値Vrefは、悪意のあるアクションによって変更することができないように、固定メモリ内に布線化される。
【００７７】
もし、監視ユニット２２が、監視命令Inst.ｎ＋１を実行しながら、前述の値VrefとVHｎの間に同一性があると確認したならば、全ての命令、Inst.１，Inst.２，Inst.３，…，Inst.ｎが、それらの実行のためにプロセッサ４に確実に伝送されたと判断される。
【００７８】
その反対に、もし監視ユニット２２が、値VrefとVHｎとの間に同一性がないと確認したならば、全ての命令、Inst.１，Inst.２，Inst.３，…，Inst.ｎが、監視ユニットによって受信および伝送されなかったと判断されるか、あるいは予定されていたシーケンスの順序になかったと判断される。この場合、プログラムのユーザーまたは名義人に警告を発するような、またはプログラムが続行するのを阻止するようなアクションを備えることができる。例では、このようなアクションは、監視ユニット２２からプロセッサ４に、プログラム割込みコマンドInt.の形で伝送される。
【００７９】
今度は、図２の手段で実現されているような監視方法が、図３に示されているフローチャートを参照して記載されている。監視すべきプログラムまたはプログラムの部分が、監視方法について、第１および第２の監視命令を最初と最後に組み込むことによって、正しく準備されたと仮定する。
【００８０】
初期の段階で、監視ユニット２２は、監視の最初のルーチン３０に位置し、その第１ステップ３２は、第１の監視命令（Inst.０）の待機である。
【００８１】
第１の監視命令Inst.０を受信した際、監視ユニット２２は、命令カウンタおよびレジスタ２４の初期化ステップ３４（ゼロへのリセットによる）を行う。レジスタ２４のゼロへのリセットは、後に説明されるように、ハッシュ演算のシーケンスを開始するために、このレジスタに“種”の値を置く方法である。これらの演算は、第１の監視命令によって直接コマンドされるか、あるいは単に、第１の監視命令によって、監視ユニット２２と関連したルーチンから始動することができる。
【００８２】
前者の場合、ゼロへのリセットは、アセンブラで書かれた新規の演算コード（例えば“clr  us”）を付加することによって、またはプログラム実行装置２０のメモリ内のあるビットを処理することによって、実現することができる。このようなコマンドは、“setb  3,  service”であることができる。
【００８３】
初期化ステップの後、監視ユニット２２は、命令カウンタを１単位インクリメントする（その時、このカウンタはｎ＝１を指す）（ステップ３６）。
【００８４】
次に、監視下にあるプログラムまたはプログラムの部分の第１の命令Inst.１は、命令レジスタ２から読み取られる（ステップ３８）。上記に説明されたように、この命令は、監視ユニット２２によって、純粋に、算術演算を可能にする数値としてみなされる。図２の例では、この値は４０である。
【００８５】
そこで、この第１の命令Inst.１の数値に、レジスタ２４に保存される値と共に、ハッシュ演算を適用する（ステップ４０）。第１の命令の場合、この最後の値は、初期化の値、つまり０である。
【００８６】
ハッシュ演算自体はよく知られているが、ここでは、数学演算子ｆ（VHｎ−１，Vinst.ｎ）を、対象となる命令ｎの値において作用させることから成り、ここで、VHｎ−１は、レジスタ２４に記録された先のハッシュ演算の結果（または、第１の命令の場合では初期化の値）であり、Vinst.ｎは、対象となる命令ｎの数値である。
【００８７】
続いて、このハッシュ演算の結果VHｎは、先の結果VHｎ−１に入れ代わってレジスタ２４に記録される（ステップ４２）。この毎回のハッシュ演算のたびにレジスタの内容の再更新の手続きによって、最後の初期化以来実行された命令コードおよびアドレスの暗号方式的にハッシングされたものを、恒久的に保持できることに留意する。
【００８８】
このハッシュ演算の終わりに、命令はその実行のためにプロセッサ４に伝送される（ステップ４４）。
【００８９】
ついで、監視ユニット２２は、監視すべきプログラムまたはプログラムの部分が、実行すべき別の命令を含んでいるかを明確にする（ステップ４６）。
【００９０】
その場合、手続きは、ｎからｎ＋１へのインクリメントのステップ３６にフィードバックB1する。そこで、次の命令（Inst.２）の次の値は、命令レジスタ２から読み取られ、命令Inst.１と同じように、ハッシュ演算が適用される。ただ、今回のハッシングは、まず命令Inst.２の数値と、先のハッシュ演算の際に得られた結果、すなわちレジスタ２４内にその時在る値VH1（ｎはここでは２に等しい）とで行われる。
【００９１】
本方法のステップ４２から４６は、第１の命令と同様に行われる。したがって、ステップ３６から４６の全体は、命令レジスタ２から読み取られるそれぞれの命令Inst.１，Inst.２，Inst.３，…，Inst.ｎごとに、ループで続行され、命令Inst.i（ｉは１からｎの間の整数である）については、レジスタ２４における値VHｎｉ−１と、値Vinst.iとでハッシングが行われる。
【００９２】
監視ユニット２２によって、全ての命令、Inst.１，Inst.２，Inst.３，…，Inst.ｎがこのように一旦処理されると、この監視ユニットは、第２の監視命令Inst.ｎ＋１を受信するが、この第２の監視命令は、監視されるプログラムまたはプログラムの部分の最後の命令Inst.ｎの後に続くものである。
【００９３】
この第２の監視命令は、監視ユニット２２が、プログラムの基準値Vrefを抽出すること（ステップ４８）、およびレジスタ２４の内容をこの値Vrefと比較すること（ステップ５０）をコマンドする。このコマンドは、ループ“lda−sta”によって実現することができる。
【００９４】
ステップ３６から４６の連続的ループを実行することにより、この段階でレジスタ２４に含まれている値が、前回のハッシュ結果VHｎ−１と、命令ｎ（図２の例においては３６に等しい）の数値とによって実現されたハッシュ結果VHｎであることが想起される。
【００９５】
基準値Vrefは、ハッシュ演算を考慮した上で、プログラムの作成の際に、全ての命令、Inst.１，Inst.２，Inst.３，…，Inst.ｎが確実にプロセッサ４に送られた場合に、監視ユニット２２が値VHｎとして与えるべきであろうものに等しくなるように、前もって決定される。
【００９６】
このように、比較の結果によって、命令、Inst.１，Inst.２，Inst.３，…，Inst.ｎの良好なランを確認することができ：VHｎ＝Vrefである場合（ステップ５２）、全ての命令が、実際にプロセッサ４へ送られたと仮定する。監視演算は、命令Inst.１，Inst.２，Inst.３，…，Inst.ｎを含むプログラムまたはプログラムの部分については、ここで終了する。
【００９７】
そして、監視手続きは、開始段階３０に戻り、新しい第１の監視命令を待つ。
【００９８】
その反対に、比較ステップ５０が、比較された値の間で同一性を有さない（VHｎ≠Vref）ことを示す場合、全ての命令、Inst.１，Inst.２，Inst.３，…，Inst.ｎがプロセッサ４へ送られていなかったか、あるいは、正しい順序で送られていなかったと仮定する（ステップ５４）。実際、連続するハッシュ演算の結果は、それらが行われた順序に依存する。
【００９９】
この場合、監視ユニット２２は、プログラムの割込み、および／または、プログラムが正しくランしなかったことの記録のようなアクション（ステップ５６）をコマンドする。
【０１００】
ここで、先に引用された監視方法の変型が、図４のフローチャートを参照して説明される。この変型によると、監視ユニット２２により、新規の命令を受信するたびにハッシュ演算を行う代わりに、第２の監視命令の受信後にのみ、ハッシュ演算の全体を実現する。図４のフローチャートでは、図３を参照して先に記載されたステップと同一なものには、同じ参照番号がつけられ、簡潔さのために、改めて説明されることはない。
【０１０１】
監視方法は、ステップ３０から３８については、先の場合のようにランする（図３および４）。命令レジスタ２から命令の値Vinst.ｎを読み取るステップ３８の後、監視ユニット２２は、この値の記録を行う（ステップ３９）。この記録は、計算機２６の内部レジスタに、又はレジスタ２４の専用セクションに、あるいは監視ユニット２２の特別なメモリ（図示せず）、さらに又は外部メモリが監視ユニットによってアクセス可能になるとすぐに監視ユニット２２の外部メモリに行われることができる。
【０１０２】
続いて、監視ユニット２２は、先に記載されたステップ４４から４６を行う。値Vinst.ｎを記録するステップ３９は、ステップ４６から、ｎを１単位インクリメントするステップ３６までを接続するループB1の中にあり、従って、それぞれの値Vinst.ｎは、ステップ４６における第２の監視命令の検知まで、このように記録されることが分かる。
【０１０３】
この第２の命令が現れると、監視ユニット２２は基準値Vrefを読み取り（ステップ４８）、ステップ４９において、図３で先に記載されたステップ４０および４２と同じアルゴリズムによって、前もって記録された値Vinst.の全体に基づいて、ハッシングを行う。その時、ハッシングの最終値VHｎは、図３の方法の場合と同じである。ステップ４８および４９の順序を逆にすることが可能であることに注目される。
【０１０４】
比較のステップ５０およびそれに続くものは、図３と同じである。
【０１０５】
図５は、本発明の第２の実施態様に合致する監視ユニット２２を簡略化したブロック図である。命令カウンタ６、命令レジスタ２およびプロセッサ４とのその機能について、プログラム実行装置２０への組み込みは、図２および３を参照して記載されている第１の実施態様と同じであり、簡潔さのために、繰り返しはされない。
【０１０６】
第２の実施態様による監視ユニット２２は、メモリ６０をさらに有することによって、第１の実施態様の監視ユニットと本質的に区別されており、該メモリは、一連の命令Inst.１−Inst.ｎの実行が、図３および４を参照して説明された基準に従って正しくランされなかった回数を記録する。
【０１０７】
例では、メモリ６０は、電気的に消去可能な内容の固定された（不揮発性の）メモリ（英語での呼称EEPROMで普通知られている）の形で製作されている。
【０１０８】
メモリ６０は、機能的には、計算機２６に接続され、監視される一連の命令において不正な実行が確認されるたびに、１単位インクリメントするカウント値VCを記録する。このように、このカウント値VCは、一連の命令の不正なランの数を検知し、その結果、例えば、この数が閾値を超えた場合、プログラムを備えた装置（例えばチップカード）の今後の一切の使用を無効にすることによって動作することを可能にする。
【０１０９】
図６のフローチャートは、プログラムの実行装置をコントロールするためのカウント値VCの使用例を示している。この例は、図３のフローチャートのステップ３０から５４の全体、または図４の類似のステップを有している。
【０１１０】
監視ユニット２２が、比較のステップ５２の後のステップ５４で、命令Inst.１−Inst.ｎの予定外の実行を検知するとき、計算ユニット２６は、最初は０に等しかったメモリ６０におけるカウント値VCを、１単位インクリメントする（ステップ６２）。次に、それは、このようにインクリメントしたカウント値VCが、所定の閾値VCseuilに達したか否かを検証する（ステップ６４）。この閾値VCseuilは、命令Inst.１−Inst.ｎの予定外の実行が、プログラムされた装置において不意に生じてもよい回数に対応し、その後、このような不良に対応するための決定的な対策が取られる。チップカードの背景における例としては、読取り装置（プログラム実行装置２０）に関する一時的な損傷であるかもしれないという疑いのために、このような不良のほどほどの数（例えば、３または４）を認めることができるが、この数を超えると、カードが、事故か、あるいは悪意によって改竄されたとみなさなければならない。このような実施の場合、プログラム装置に物理的に接続した、このような不良の実行の履歴を保持するために、プログラムされた装置（カード）に値VCを書き込むことも想定できる。
【０１１１】
カウント値VCが、閾VCseuil未満である場合、監視ユニット２２は、ユーザーおよび／またはオペレーティング・システムへの単なる警告メッセージを有する先に記載されたような割込みコマンドInt.を作成し（ステップ６６）、それをプロセッサ４に伝送する（ステップ６８）。
【０１１２】
その反対に、カウント値VCが閾値VCseuilに達する場合、監視ユニット２２は、予定外に実行される命令を含むプログラムされた装置の今後の一切の使用を禁止する命令を有する先に記載されたような割込みコマンドInt.を作成し（ステップ７０）、それをプロセッサに伝送する（ステップ６８）。この場合、メモリ６０を再プログラムしただけではこの装置を再使用することは不可能である。このメモリ６０が、EEPROMまたは他の不揮発性メモリの形態である場合、このような再プログラミングは不正なやり方では非常に実現するのが困難である。
【０１１３】
警告メッセージまたは今後の使用の無効化コマンドを伝送するのを伴うプログラムの割込みコマンドInt.は、プロセッサのレベルで、または、監視ユニット２２のレベルで実行することができることに留意する。
【０１１４】
これから、図７を参照することによって、本発明による監視ユニット２２が、どのようにして、ジャンプまたは飛び越しを備えたプログラムを監視するために実施されるかを説明する。
【０１１５】
図７の例では、プログラムの実行装置２０は、プロセッサ４に向けられる、３つの命令セットから構成されるプログラムまたはプログラムの一部分を、命令レジスタ２に有する。
−Inst.EI１−１からInst.EI１−ｊ（ｊは１より大きい整数である）の第１の命令セット：その最後の命令EI１−ｊは、次に続く他の２つのセットのどちらかへの条件分岐をコマンドするコードである。
−Inst.EI２−１からInst.EI２ｋ（ｋは１より大きい整数である）の第２の命令セット：このセットの第１の命令Inst.EI２−１は、条件分岐の命令EI１−ｊが実行されてから行われるが、それは該条件分岐の命令によって与えられた２つの条件のうちの１つ目が満たされている場合である。
−Inst.EI３−１からInst.EI３ｌ（ｌは１より大きい整数である）の第３の命令セット：このセットの第１の命令Inst.EI３−１は、条件分岐の命令EI１−ｊが実行されてから行われるが、それは該条件分岐の命令によって与えられた２つの条件のうちの２つ目が満たされている場合である。
【０１１６】
３つの命令セットEI１、EI２およびEI３は、それらの命令シーケンスの内部にジャンプを有さない。（第１の命令セットの場合、命令EI１−ｊへの条件ジャンプは、シーケンスの最後にある。）このように、３つの命令セットのそれぞれについて、全ての命令は、最初のものから逐次的に実行されるよう予定されるのである。
【０１１７】
プログラムの作成の際、各命令セットEI１、EI２およびEI３の先頭と末尾に、図２から６を参照して上記に記載された第１の監視命令と第２の監視命令をそれぞれ加える。
【０１１８】
セットEI１、EI２およびEI３によって構成される、プログラム又はプログラムの部分の監視は、以下のように行われる。
【０１１９】
監視ユニット２２は、まず、監視の開始段階に位置する（ステップ３０、図３）。
【０１２０】
ランは、第１の命令セットEI１を実行することによって始まる。このセットの先頭に位置付けられた第１の監視命令は、まず、監視ユニット２２にロードされる。この命令への応答として、監視ユニットは、その命令カウンタとハッシュ値VHのレジスタ２４を初期化し（ステップ３４、図３）、第１の命令セットのそれぞれの命令Inst.EI１−１からInst.EI１−ｊについて、図３のステップ３６から４６に沿ってハッシングルーチンを進む。
【０１２１】
このように、分岐をコマンドするセットの最後の命令EI１−ｊもまた、監視ユニット２２によりハッシングされてから、プロセッサ４へ伝送される。
【０１２２】
次の命令は、第１の命令セットEI１の末尾の第２の監視命令（図３、ステップ４６）であり、それは、レジスタ２４に記録された最後のハッシュ値と、この第２の命令に関連した基準値Vrefとの比較段階を引き起こす。
【０１２３】
比較のステップ５０（図３）において、このように記録された最後のハッシュ値が基準値Vrefに対応しないことが検知された場合、監視ユニット２２は、プログラムの割込みステップ５４および５６（図３または４）、あるいは５４から７０（図６）に進む。しかもプログラムが条件分岐を実行する前に、この割込みを起こすことを、好ましくは想定する。これは、例えば、監視ユニットから来る有効化の待機命令を有するジャンプ命令と連合することによって、周知のプログラミング技術を用いて、実現することができる。
【０１２４】
比較のステップ５０（図２）において、このように記録された最後のハッシュ値が、基準値Vrefに実際に対応することが検知された場合、監視ユニットは、セットの最後の命令EI１−ｊによって決定された条件分岐の実行を許可する。プログラムは、この最後の命令によって与えられた分岐の条件に従って、２番目または３番目の命令セットのどちらかへと続行する。
【０１２５】
例では、条件ジャンプが、実行すべき第３の命令セットへの分岐を引き起こすと仮定する。この場合、命令カウンタ６は、命令ポインタ８を、第１の命令セットEI１の末尾の第２の監視命令から、第３の命令セットEI３の先頭の第１の監視命令へと、直接移行させる。
【０１２６】
監視ユニットは、命令カウンタおよびレジスタ２４を再初期化して、この新しい第１の命令を実行する。従って、この第３の命令セットのための監視手続きは、第１の命令セットについてと全く同じように続行される。このように、監視ユニット２２は、第１のセットについてと同じ“種”の値（ここでは、０に対応する）で、ハッシングを開始することで、このセットから読み取られた命令のそれぞれの連続的ハッシングを行う。今回は、第２の監視命令は、この第３の命令セットに位置する実行においての予定外のランを発見し、ステップ５６において同じタイプのアクションを行うことを可能にする。
【０１２７】
第３のセットへの分岐の場合について与えられた説明が、第１の命令セットの分岐命令の実行の後の第２の命令セットへの分岐の場合に、きちんと同様な方法で適用されることが理解されるであろう。
【０１２８】
ジャンプを有するプログラムにおける予定外のランの数だけでなく、それらが生じた、独立して監視される命令セットもまた、監視ユニット２２によって数えることができるようにすることが可能である。
【０１２９】
このように、第２の実施態様（図５）による監視ユニット２２は、確認されたそれぞれの割込みにかかわる命令セットを、そのメモリ６０に記録することができる。割込みが起こった命令セットに応じてプログラムの今後の使用を無効にする基準をつくることも可能である。
【０１３０】
当然ながら、監視ユニット２２はプロセッサ４から分離されて製作されるか、又は、それに機能的に組み込まれることができることも理解されるであろう。
【０１３１】
最後に、方法について記載された本発明のすべての局面が、その実施の物的手段の面で容易に理解されること、そしてその逆も明白である。同様に、記載された発明は、実施態様の明白な全ての転用又はその他の形への変型をも網羅することが理解されるであろう。
【図面の簡単な説明】
【図１】  図１は、すでに紹介されたが、プログラムの実行のランにおいて命令カウンタの役割を説明することを目的とする、単純化されたブロック図である。
【図２】  図２は、本発明の第１の実施態様に合致する監視ユニットの作動原理を説明することをねらいとする、プログラム実行装置の単純化されたブロック図である。
【図３】  図３は、本発明による、監視方法のフローチャートである。
【図４】  図４は、本発明による、監視方法の変型のフローチャートである。
【図５】  図５は、本発明の第２の実施態様に合致する監視ユニットの作動原理を説明することをねらいとする、プログラム実行装置の単純化されたブロック図である。
【図６】  図６は、第２の実施態様に適した、本発明による監視方法のフローチャートである。
【図７】  図７は、監視方法に特有の命令をさらに含む分岐のある１つのプログラムの命令セットを簡略化して示している。
【図１】
0004172745.tif 000002
【図２】
0004172745.tif 000003
【図３】
0004172745.tif 000004
【図４】
0004172745.tif 000005
【図５】
0004172745.tif 000006
【図６】
0004172745.tif 000007
【図７】
0004172745.tif 000008