【課題を解決するための手段】
【0011】
発明者らは、秘密データ(例えば、暗号鍵)に関する情報の漏出が、秘密のデータに基づき動作するマシンコード命令の演算及び論理回路の使用により第一にもたらされることを観測した。第一に斯様な命令を回避することが可能であった場合、サイドチャネル漏出の根本的原因のうち1つは対処されるだろう。
【0012】
本発明の態様は、独立請求項において規定される。従属請求項は、有利な実施形態を規定する。
【0013】
第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムを第2のコンピュータプログラムにコンパイルするためのコンパイラが提供される。第2のコンピュータプログラムは、マシンプログラミング言語であってもよいが、より一般に任意のコンピュータプログラミング言語であってもよい。コンパイラは、テーブル及びマシン言語コードを生成することにより前記第2のコンピュータプログラムを生成するためのコードジェネレータを有し、生成されたテーブル及び生成されたマシン言語コードは、前記第2のコンピュータプログラムを一緒に形成し、生成されたマシン言語コードは、テーブルを参照し、当該コンパイラは、前記第1のコンピュータプログラムにおける演算又は論理表現を識別するように構成され、前記の表現は、少なくとも1つの変数又はデータアイテムに依存し、前記コードジェネレータは、前記変数の複数の値のための識別された表現の予め計算された結果を表す1又はそれ以上のテーブルを生成し、予め計算された結果を表す生成された1又はそれ以上のテーブルにアクセスすることにより前記第2のコンピュータプログラムにおいて前記識別された表現を実装するためのマシン言語コードを生成するように構成される。
【0014】
少ない演算又は論理演算しか含まないので、第2のコンピュータプログラムのサイドチャネル漏出はより低くなる。理想的には、全ての演算及び論理表現及び下位表現がテーブルアクセスに置換される。演算又は論理表現又は下位表現を構成するこれらの命令がないので、これらは如何なる情報も漏らし得ない。テーブルは事前計算される。即ち、テーブルに囲まれる演算又は論理的動作を実行するために消費される電力は、プログラムの実行中に可視ではない。
【0015】
更に、命令セットが削減されるので、実行されるプログラムを非常によりしっかりと復元する。実際に、サイドチャネル情報は、過去において、埋め込まれたプロセッサ上で実行されるプログラムの大部分を回復するために用いられていた。例えば、Thomas Eisenbarth, Christof Paar, and Bjorn Weghenkelによる"Building a Side channel Based Disassembler", Springer Transactions on Computational Science, Special Issue on "Security in Computing", 2010を参照。サイドチャネルに基づく分解は、典型的には、オペランドではなく命令のタイプを示す。その理由は、オペランドが(言わばDPAを用いた)よりきめ細かい統計分析を必要とするためである。したがって、使用される命令のタイプの数を低減することにより、命令のタイプを知ることからはあまり情報は示されない。極端には、演算子のないコンパイルが用いられるときには、その分解は、ロード及びストア動作が用いられるよりも、分解の前に明瞭である何かが始まることをほとんど示さないだろう。従って、例えば、所有者の暗号アルゴリズムがより少ない命令を用いて実装される場合、サイドチャネル情報から暗号アルゴリズムをリバースエンジニアリングするのがより難しくなるだろう。
【0016】
コンパイラは、第1のプログラムと少なくとも意味的に等価である第2のプログラムを生成する。但し、第2のプログラムは、第1のプログラムより多くのことを行い得る。
【0017】
第1のコンピュータプログラムは、より大きなコンピュータプログラムの部分であってもよい。その場合、コンパイラは、より大きなコンピュータプログラムの部分のみをコンパイルする。これは、演算子のないコンパイルが典型的には大きな量のメモリを必要とするので、利点である。それ故、演算子のないコンパイルをより大きなプログラムのより重要な部分に限定することが有利である。同様に、第2のコンピュータプログラムは、より大きな第2のコンピュータプログラムの部分であってもよい。より大きな第2のコンピュータプログラムは、全体として演算子のない状態でコンパイルされる必要はない。
【0018】
通常、コンパイラは、1つを超える表現(例えば、演算又は論理表現)を識別するだろう。予め計算された結果は、識別された表現に関連していてもよい。表現が依存する1つを超える変数があってもよい。この場合、テーブルは、変数の複数の値のための予め計算された結果を表してもよい。コンパイラは、複数の変数に依存して、表現を、より少ない変数に依存するより小さな表現の組み合わせに分割することを決めるための決定論理を有してもよい。
【0019】
一実施形態において、表現が依存する変数は、セキュリティに関連したデータ(例えば、暗号鍵)と相関される。
【0020】
一実施形態において、第2のコンピュータプログラムは、マシン言語において記述される。
【0021】
一実施形態において、識別された表現を実装するために生成されるマシン言語コードは、演算又は論理マシン命令を含まない。
【0022】
一実施形態において、識別された表現を実装するために生成されるマシン言語コードは、演算又は論理を含まない、及び、条件文のマシン命令を含まない。演算又は論理マシン命令も条件文の命令も回避することが有利であることに注意されたい。一実施形態において、第2のコンピュータプログラムは、演算又は論理を含まない、及び/又は、条件文のマシン命令を含まない。好ましくは、暗号鍵の少なくとも部分に依存するか又はこれと相関される入力を有する少なくとも表現は、演算を伴わない第2のコンピュータプログラム又は論理マシン命令及び/又は条件文の命令において実装される。
【0023】
コンパイラは、計算機読み取り可能媒体上に格納されてもよい。即ち、マシン読み取り可読格納デバイスにおいて明白に具現化される。コンパイラは、例えばネットワーク(例えば、ワイヤレスネットワーク又はインターネット等)を介して受信されるデジタル信号としてダウンロードされてもよい。コンパイラは、コンパイルするためのコンピュータ制御の方法として表されてもよい。
【0024】
マシン言語は、場合により更なる関連付けステップを必要とする、コンピュータプロセッサ上で実行可能な言語である。第2のコンピュータプログラムは、異なるコンパイラによってコンパイルされた他のコンピュータプログラムに関連付けられてもよいことに留意されたい。第2のプログラムは、例えば、1又はそれ以上のメモリ及びプロセッサを有するコンピュータ上で実行されてもよく。プロセッサは、レジスタを有する。プロセッサは、マシン命令セットを解釈するように構成される。一部のマシン命令は、メモリとレジスタとの間でデータを転送する。マシン命令がデータ(典型的にはレジスタ)に影響する命令をサポートする場合であっても、コンパイラはそれらを用いる必要はない。例えば、コンパイラは、演算及び論理命令をサポートするプロセッサのためのコードを生成するために用いられてもよい。しかしながら、コンパイラは、それらを用いることを回避する。また、コンパイラは、演算及び論理命令をサポートしないプロセッサの使用を可能にする。コードジェネレータは、マシンコード命令のストリームを生成してもよい。
【0025】
コンパイラは、第1のコンピュータプログラミング言語において記述されたプログラムを受信するための入力部を有してもよい。コンパイラは、第1のコンピュータプログラミング言語を構文解析するように構成されるパーサを有してもよく、コードジェネレータは、パーサの制御下でマシン言語コードを生成するように構成されてもよい。構文解析は、文法に従うものであってもよい。例えば、パーサは、パーサにより検出される言語要素に対応するコードを生成するためのコードジェネレータルーチンを呼び出し得る。パーサは、例えば構文解析ツリーを生成することにより、第1のプログラムの内部表現を生成し有る。
【0026】
コンパイラは、第1のプログラムの一連の文字を第1のコンピュータプログラミング言語の一連のトークンに変換することを有する、語彙解析のための語彙スキャナを有し得る。語彙スキャナは、パーサの前で実行されてもよく、又は、パーサの部分であってもよい。
【0027】
一実施形態において、生成されたマシン言語コードは、条件文のマシン命令を含まない。条件文のマシン命令は、条件文が特定の値を有する場合、及び、そうでない場合に、或る動作を実行する命令である。条件文の命令は、以下のものを含む;或るレジスタが或る値を有する場合にのみジャンプする条件付きのジャンプ命令、条件付きの代入、及び、レジスタが或る値を有する場合に繰り上げビットをセット又はリセットするいわゆる比較命令。コンパイラは、予め計算された分岐テーブルを用いて条件文の命令を回避してもよい。分岐テーブルは、好ましくは、必要とされるジャンプアドレスが取り出されるポインタのテーブルとして実装される。取り出されるアドレスは、条件文に依存する。分岐テーブルは、条件文に依存するオフセットを用いて分岐される無条件の分岐命令のシリアルのリストとして実装されてもよい。オフセットは、テーブルを用いることにより、又は、必要とされた加算を実現するために1又はそれ以上のテーブルを用いるルーチンによりベースアドレスに追加される。32ビットオフセット加算が小さな加算テーブルの繰り返された使用により実装され得ることに留意されたい。
【0028】
また、条件文の命令は、これらの電力消費が特定の条件が真か否かに関連付けられるので、サイドチャネル情報の重要なソースであり、それ故、条件に関する情報を直接漏らす。
【0029】
好ましい実施形態において、第2のコンピュータプログラムコードは、いわゆる"演算子のない"ものである。演算子のないコードは、移動(即ち、ロード、演算、レジスタとメモリとの間でデータを転送するためのストア演算、ジャンプ演算)のみを有する。演算及び論理命令のような命令を漏らす演算子のないコード情報の使用は回避される。移動、ロード及びストア演算は、例えば使用されるテーブルをエンコードすることにより、エンコーディングに非常に従うことに留意されたい。それ故、任意の残りの電力漏出は、テーブルをエンコードすることにより低減され得る。演算子のないコードは、以下を含んでもよい:定数を伴うロードレジスタ、他のレジスタを伴うロードレジスタ、メモリアドレスで格納される値を伴うロードレジスタ、1又はそれ以上のレジスタにより示される1又はそれ以上のメモリアドレスに1又はそれ以上のレジスタの格納、レジスタ(又は直接アドレス)により示されたメモリアドレスまでのジャンプ。
【0030】
プロセッサが、好ましくは移動、又はストア演算を介して、プログラムカウンタの操作の一部のタイプを可能にする場合、ジャンプ命令は回避されてもよいことに留意されたい。例えば、このアドレスレジスタの全ての下位レジスタが、並列にロードされるか、又は、少なくとも次の命令のロードが効力を有する前にロードされる、プログラムカウンタに対するロードが可能である場合、ジャンプがもたらされてもよい。好ましい実施形態において、命令セットは、アドレスレジスタにストアされるメモリアドレスまでのジャンプを有する。これは、条件付きのジャンプが、レジスタ又はその部分へのロード及びストアを介して実装されるのを可能にする。
【0031】
一実施形態において、ロード演算は、以下のうちの1つを伴うレジスタをロードするためのものである:定数、メモリアドレスにストアされた値及び他のレジスタ。メモリアドレスは、1又はそれ以上の定数及び/又はレジスタにより示される。一実施形態において、ストア演算は、1又はそれ以上のメモリアドレスにおける1又はそれ以上の定数及び/又はレジスタをストアするためのものである。メモリアドレスは、1又はそれ以上のレジスタ値、及び/又は、定数により示される。一実施形態において、ジャンプ演算は、メモリアドレスまでジャンプするためのものである。メモリアドレスは、1又はそれ以上の定数及び/又はレジスタにより示されるか、又は、メモリアドレスは、更なるメモリアドレスから取り出される。
【0032】
一実施形態において、マシン言語はレジスタに作用し、レジスタのサブセットが、メモリアドレスを含めるためのアドレスレジスタを形成する。例えば、各レジスタは、多数のビット(即ち、8ビット)を含む。及び、各アドレスレジスタは、多数のレジスタ(即ち、4)を含む。これは、アドレス計算を必要とすることなくテーブルアクセスを可能にし、レジスタに依存するテーブルアクセスは、アドレスレジスタのレジスタをロードすることにより実装され得る。これは、アドレス算出ユニットの加算(演算)を除去するので、重要である。また、この加算は、情報を明らかにすることができる。
【0033】
一実施形態において、幾つかのテーブルは、2の累乗の倍数であるメモリアドレスに格納される。テーブルの開始は、レジスタにビットがあるので、ゼロ最下位ビットの同じ数を有するアドレスに格納される。一実施形態において、テーブルの幾つかの開始は、レジスタにビットがあるので、ゼロ最下位ビットの数の2倍を有するアドレスに格納される。それ故、定数及びレジスタを効果的に連結することにより、テーブルにおける索引を可能にし、それ故計算が回避される。複数のオペランドを用いたオペランドは、複数のゼロビットを有するアドレスにテーブルを配置することによりサポートされてもよい。
【0034】
例えば加算及び乗算のテーブルが2の累乗の境界に格納される一実施形態においては、2の累乗の境界に他のテーブルも置く必要がない。テーブル化された加算及び乗算を用いて、我々は、プロセッサによりサポートされた演算又は論理の使用を伴うことなく、テーブル化された加算又は乗算の使用を介して、任意の基数+タイプサイズ(typesize)*オフセットを計算する。従って、プログラム1のテーブルアクセスの他のテーブルアクセス、又は、少なくとも意味論的に等価なプログラム2の取り込まれたテーブルは、演算子のないコード加算、及び/又は、テーブル駆動される乗算の使用を介して生成され得る。
【0035】
一実施形態において、コンパイラは、第1のコンピュータプログラムにおいて、1又はそれ以上のデータアイテムに影響する算術又は論理マシン演算のような演算子を識別するように構成され、コードジェネレータは、同じアドレスレジスタのそれぞれのレジスタにおけるデータアイテムのそれぞれをロードするためのマシン言語コードを生成するように構成され、アドレスレジスタがテーブル入力を示すようにアドレスレジスタの他のレジスタにおけるデータをロードし、アドレスレジスタにより示されたメモリアドレスからレジスタへのデータアイテムに影響する演算子の結果をロードする。第1のプログラムが演算を明示的に含むという点で、第1のコンピュータプログラムにおける演算子を識別することは、直接識別することであり得る。しかし、識別することは、黙示的であってもよく、コンパイラが、マシン言語コードを生成する前に第1のコンピュータプログラムを中間の表現に変換したことを意味する。斯様な中間言語は、レジスタ伝達言語であってもよい。
【0036】
一実施形態において、コンパイラは、第1のコンピュータプログラムにおいて条件付きのジャンプを識別するように構成され、コードジェネレータは、アドレスレジスタのレジスタにおいて条件を示す値を保持するレジスタをロードするためのマシンコードを生成するように構成され、アドレスレジスタがテーブル入力を示すようにアドレスレジスタの他のレジスタにおけるデータをロードし、アドレスレジスタにより示されたメモリアドレスにおけるメモリに格納されたメモリアドレスまでジャンプする。
【0037】
本発明の一態様は、第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムを、算術及び/又は論理命令を伴わない及び/又は条件付きの命令を伴わない形式に、オプションとして演算子のない形式で、コンパイルするためのコンパイラとして構成されるコンピュータに関する。
【0038】
本発明の態様は、第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムを第2のコンピュータプログラミング言語において記述される第2のコンピュータプログラムにコンパイルするためのコンパイラに関する。コンパイラは、テーブル及び第2のプログラミング言語コードを生成することにより第2のコンピュータプログラムを生成するためのコードジェネレータを有し、生成されたテーブル及び生成された第2のプログラミング言語コードは、第2のコンピュータプログラムを一緒に形成し、生成された第2のプログラミング言語コードは、前記テーブルを参照し、生成された第2のプログラミング言語コードは、算術又は論理マシン命令を含まず、前記テーブルは、算術及び/又は論理マシン命令の予め計算された結果を有する。第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムを第2のコンピュータプログラミング言語において記述される第2のコンピュータプログラムにコンパイルするためのコンパイラは、マシン言語命令のために第2のプログラミング言語からの等価物が選択されなければならないことを除き、第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムをマシン言語において記述される第2のコンピュータプログラムにコンパイルするためのコンパイラと同じ技術を用いることができる。
【0039】
一実施形態において、コンパイラは、例えば、中央処理ユニット(CPU)と、第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムをマシン言語において記述される第2のコンピュータプログラムにコンパイルするために前記CPUに結合されたメモリとを有する、電子装置である。装置は、第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムを受信するための入力部と、テーブル及びマシン言語コードを生成することにより第2のコンピュータプログラムを生成するためのコードジェネレータとを有し、生成されたテーブル及び生成されたマシン言語コードは、第2のコンピュータプログラムを一緒に形成する。生成されたマシン言語コードは、テーブルを参照し、生成されたマシン言語コードは、算術又は論理マシン命令を含まず、テーブルは、算術及び/又は論理マシン命令の予め計算された結果を有する。
【0040】
本発明の態様は、第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムをマシン言語において記述される第2のコンピュータプログラムにコンパイルするための方法に関し、当該方法は、テーブル及びマシン言語コードを生成することにより前記第2のコンピュータプログラムを生成するステップを有し、生成されたテーブル及び生成されたマシン言語コードは、前記第2のコンピュータプログラムを一緒に形成し、生成されたマシン言語コードは、テーブルを参照し、生成されたマシン言語コードは、算術又は論理マシン命令を含まず、前記テーブルは、算術及び/又は論理マシン命令の予め計算された結果を有する。
【0041】
本発明の一態様は、第1のコンピュータプログラムをコンパイルするためのコンパイル方法に関し、当該方法は、第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムを、算術又は論理マシン命令を含まない第2のコンピュータプログラミング言語において記述される第2のコンピュータプログラムにコンパイルするステップであって、前記テーブルは、算術及び/又は論理マシン命令の予め計算された結果を有する、ステップと、第1のテーブル及び第2のプログラミング言語コードを取得するステップと、前記第2のコンピュータプログラムを解釈するためにバーチャルマシンプログラムを算術又は論理マシン命令を含まないマシン言語にコンパイルするステップであって、前記バーチャルマシンプログラムは、更なる第1のコンピュータプログラミング言語において書き込まれる、ステップと、生成されたマシン言語コード及び第2のテーブルを取得するステップとを有し、前記テーブルは、算術及び/又は論理マシン命令の予め計算された結果を有する。
【0042】
コンピュータプログラムがバーチャルマシン上での実行に適している(及び、バーチャルマシンのためのインタプリタのコンパイルと組み合わせる)第2のコンピュータプログラムにコンパイルされるこの構造、好ましくは演算子のないコンパイラは、"von Munchhausen"コンパイルと呼ばれる。これは、演算子のないプログラムにより与えられる保護を提供するが、例えばsandboxingのようなバーチャルマシン実行により与えられる保護も提供する。VM及びプログラムは、スタンドアロンであってもよい。また、VMのフィーチャは、それ故、組み合わせられた結果、例えば実行の間のコード確認、難読化等に対して与えられてもよい。
【0043】
von Munchhausen構造に従ってコンパイルされたプログラムは、特別な形式を有する。即ち、これらは、2セットのテーブル、各コンパイルから1つ、及び、1つの実行ファイルを有する。本発明の態様は、コンパイラにより、第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムを第2のコンピュータプログラミング言語において記述される第2のコンピュータプログラムにコンパイルすることにより生成される第1のテーブル及び第2のプログラミング言語コードと、コンパイラにより、前記第2のコンピュータプログラムを解釈するためにバーチャルマシンプログラムをマシン言語にコンパイルすることにより生成される第2のテーブル及びマシン言語コードとを有し、前記バーチャルマシンプログラムは、更なる第1のコンピュータプログラミング言語において記述される、コンピュータプログラムに関する。1つは、プログラムとVMとの間でテーブルを共有するかしないかの選択を有する。そうでもあっても、分岐テーブルは、典型的には、プログラム及びVMの専用である。
【0044】
本発明の方法は、コンピュータに実装された方法としてのコンピュータ上で、若しくは、専用のハードウェアにおいて、又は、これらの組み合わせにおいて、実装されてもよい。本発明の方法のための実行可能なコードは、コンピュータプログラム製品上に格納されてもよい。コンピュータプログラム製品の例としては、メモリデバイス、光学格納デバイス、集積回路、サーバ、オンラインソフト等が挙げられる。好ましくは、コンピュータプログラム製品は、前記プログラム製品がコンピュータ上で実行されたときに本発明の方法を実行するためにコンピュータ読み取り可能な媒体上に格納される非一時的プログラムコード手段を有する。
【0045】
好ましい実施形態において、コンピュータプログラムは、コンピュータプログラムがコンピュータ上で実行されたときに本発明の方法の全てのステップを実行するように適合されたコンピュータプログラムコード手段を有する。好ましくは、コンピュータプログラムは、コンピュータ読み取り可能な媒体上に具現化される。
【0046】
一実施形態において、生成されたテーブルは、明細書において示されるように、難読化される。例えば、Oが難読化しているエンコーディングを表す場合、テーブルは、表現又は演算子fに対して以下のように構成され得る:O (f( O-1(x), O-1(y)))。
【0047】
一実施形態において、難読化は、鍵により制御され、これは、コンパイラに入力される。例えば、鍵は、疑似ランダムストリームを生成するために用いられてもよく、これは、難読化するエンコーディングを選択するために用いられる。面白いことに、これは、特定のコンパイルを鍵に関連付ける。関連付けは、例えば、特定のユーザが特定のソフトウェアのコンパイルに含まれたことを証明するために、ソフトウェアから指紋をとるために後に用いられてもよい。鍵は、場合によりホワイトボックスの実装において、コンパイラに埋め込まれてもよい。例えば、破壊工作ソフトの製作者は、コンパイルされた製品において使用されるエンコーディングを介して追跡され得る。
【0048】
本発明のこれらの及び他の態様は、以下で述べられる実施形態から明らかになり、これらを参照して説明されるだろう。