(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024117906
(43)【公開日】2024-08-30
(54)【発明の名称】セキュアエレメントおよび仮想マシン
(51)【国際特許分類】
G06F 21/55 20130101AFI20240823BHJP
【FI】
G06F21/55 320
【審査請求】未請求
【請求項の数】12
【出願形態】OL
(21)【出願番号】P 2023023990
(22)【出願日】2023-02-20
(71)【出願人】
【識別番号】000002897
【氏名又は名称】大日本印刷株式会社
(74)【代理人】
【識別番号】100122529
【弁理士】
【氏名又は名称】藤枡 裕実
(74)【代理人】
【識別番号】100135954
【弁理士】
【氏名又は名称】深町 圭子
(74)【代理人】
【識別番号】100119057
【弁理士】
【氏名又は名称】伊藤 英生
(74)【代理人】
【識別番号】100131369
【弁理士】
【氏名又は名称】後藤 直樹
(74)【代理人】
【識別番号】100171859
【弁理士】
【氏名又は名称】立石 英之
(72)【発明者】
【氏名】木下 靖夫
(72)【発明者】
【氏名】平野 晋健
(72)【発明者】
【氏名】福永 正剛
(72)【発明者】
【氏名】高橋 憲介
(72)【発明者】
【氏名】高田 憲一
(72)【発明者】
【氏名】嘉瀬 悠太
(57)【要約】
【課題】故障利用攻撃や外乱ノイズにより、仮想マシンが使用するメモリの内容が変化しても、仮想マシンが誤動作することなく処理を継続できるようにする。
【解決手段】セキュアエレメント1に実装する仮想マシン10は、PC100を参照してバイトコードをフェッチし、フェッチしたバイトコードをデコードしてバイトコードに応じた命令102をディスパッチした後、ディスパッチした命令102を実行する前に、命令102のディスパッチに用いたバイトコードとこの時点のPC100を参照してフェッチしたバイトコードを比較し、これら2つのバイトコードが同じ場合、バイトコードに応じた命令を実行し、これら2つのバイトコードが異なる場合、バイトコードを実行する処理を再実行する。
【選択図】
図3
【特許請求の範囲】
【請求項1】
仮想マシンを実装したセキュアエレメントであって、
前記仮想マシンは、
実行するバイトコードが格納されているメモリアドレスを指し示すプログラムカウンタと、前記プログラムカウンタが指し示すメモリアドレスに格納されたバイトコードを実行するバイトコード処理部を備え、
前記バイトコード処理部は、前記プログラムカウンタを参照してバイトコードをフェッチし、フェッチしたバイトコードをデコードしてバイトコードに応じた命令をディスパッチした後、命令を実行する前に、命令のディスパッチに用いたバイトコードとこの時点の前記プログラムカウンタを参照してフェッチしたバイトコードを比較し、これら2つのバイトコードが同じ場合、バイトコードに応じた命令を実行し、これら2つのバイトコードが異なる場合、バイトコードを実行する処理を再実行する、
ことを特徴とするセキュアエレメント。
【請求項2】
前記バイトコード処理部は、バイトコードを実行する処理を再実行した第1再実行回数をカウントし、前記第1再実行回数が閾値を超えるとエラー処理を実行することを特徴とする、請求項1に記載したセキュアエレメント。
【請求項3】
前記バイトコード処理部は、バイトコードに応じた命令が、条件が成立するか否かにより分岐先を呼び出すか否かを決定する分岐命令の場合、前記分岐命令を実行した後に、再度、前記分岐命令を実行し、最初に前記分岐命令を実行したときの前記プログラムカウンタの値と、2回目の前記分岐命令を実行した後の前記プログラムカウンタの値を比較し、これら2つの前記プログラムカウンタの値が異なる場合、前記分岐命令を再実行する、
ことを特徴とする、請求項1または2に記載したセキュアエレメント。
【請求項4】
前記バイトコード処理部は、前記分岐命令を再実行した第2再実行回数をカウントし、前記第2再実行回数が閾値を超えるとエラー処理を実行することを特徴とする、請求項3に記載したセキュアエレメント。
【請求項5】
セキュアエレメントに実装する仮想マシンであって、
実行するバイトコードが格納されているメモリアドレスを指し示すプログラムカウンタと、前記プログラムカウンタが指し示すメモリアドレスに格納されたバイトコードを実行するバイトコード処理部を備え、
前記バイトコード処理部は、前記プログラムカウンタを参照してバイトコードをフェッチし、フェッチしたバイトコードをデコードしてバイトコードに応じた命令をディスパッチした後、命令を実行する前に、命令のディスパッチに用いたバイトコードとこの時点の前記プログラムカウンタを参照してフェッチしたバイトコードを比較し、これら2つのバイトコードが同じ場合、バイトコードに応じた命令を実行し、これら2つのバイトコードが異なる場合、バイトコードを実行する処理を再実行する、
ことを特徴とする仮想マシン。
【請求項6】
前記バイトコード処理部は、バイトコードを実行する処理を再実行した第1再実行回数をカウントし、前記第1再実行回数が閾値を超えるとエラー処理を実行することを特徴とする、請求項5に記載した仮想マシン。
【請求項7】
前記バイトコード処理部は、バイトコードに応じた命令が、条件が成立するか否かにより分岐先を呼び出すか否かを決定する分岐命令の場合、前記分岐命令を実行した後に、再度、前記分岐命令を実行し、最初に前記分岐命令を実行したときの前記プログラムカウンタの値と、2回目の前記分岐命令を実行した後の前記プログラムカウンタの値を比較し、これら2つの前記プログラムカウンタの値が異なる場合、前記分岐命令を再実行する、
ことを特徴とする、請求項5または6に記載した仮想マシン。
【請求項8】
前記バイトコード処理部は、前記分岐命令を再実行した第2再実行回数をカウントし、前記第2再実行回数が閾値を超えるエラー処理を実行することを特徴とする、請求項7に記載した仮想マシン。
【請求項9】
セキュアエレメントを実装したICカードであって、
前記セキュアエレメントは仮想マシンを備え、
前記仮想マシンは、
実行するバイトコードが格納されているメモリアドレスを指し示すプログラムカウンタと、前記プログラムカウンタが指し示すメモリアドレスに格納されたバイトコードを実行するバイトコード処理部を備え、
前記バイトコード処理部は、前記プログラムカウンタを参照してバイトコードをフェッチし、フェッチしたバイトコードをデコードしてバイトコードに応じた命令をディスパッチした後、命令を実行する前に、命令のディスパッチに用いたバイトコードとこの時点の前記プログラムカウンタを参照してフェッチしたバイトコードを比較し、これら2つのバイトコードが同じ場合、バイトコードに応じた命令を実行し、これら2つのバイトコードが異なる場合、バイトコードを実行する処理を再実行する、
ことを特徴とするICカード。
【請求項10】
前記バイトコード処理部は、バイトコードを実行する処理を再実行した第1再実行回数をカウントし、前記第1再実行回数が閾値を超えるとエラー処理を実行することを特徴とする、請求項9に記載したICカード。
【請求項11】
前記バイトコード処理部は、バイトコードに応じた命令が、条件が成立するか否かにより分岐先を呼び出すか否かを決定する分岐命令の場合、前記分岐命令を実行した後に、再度、前記分岐命令を実行し、最初に前記分岐命令を実行したときの前記プログラムカウンタの値と、2回目の前記分岐命令を実行した後の前記プログラムカウンタの値を比較し、これら2つの前記プログラムカウンタの値が異なる場合、前記分岐命令を再実行する、
ことを特徴とする、請求項9または10に記載したICカード。
【請求項12】
前記バイトコード処理部は、前記分岐命令を再実行した第2再実行回数をカウントし、前記第2再実行回数が閾値を超えるとエラー処理を実行することを特徴とする、請求項11に記載したICカード。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、仮想マシンを搭載したセキュアエレメントに関する。より詳細には、本発明は、故障利用攻撃や外乱ノイズの影響によるセキュアエレメントの誤動作を防止する技術に関する。
【背景技術】
【0002】
機密性の高い情報を格納するセキュアエレメントに、Java(登録商標)などの仮想マシン(VM: Virtual Machine)を実装するケースが増えている。特許文献1の背景技術に記載がある通り、レーザを照射するなどの故障利用攻撃や外乱ノイズの影響で、メモリの内容が変化すると、セキュアエレメントに実装された仮想マシンが誤動作することがある。特許文献2では、仮想マシンが、故障利用攻撃や外乱ノイズによりメモリの内容が変化したことを検知すると、仮想マシンの動作を停止するなどして、セキュアエレメントの誤動作を防止している。
【先行技術文献】
【特許文献】
【0003】
【特許文献1】特開2018-88147号公報
【特許文献2】特開2009-288908号公報
【発明の概要】
【発明が解決しようとする課題】
【0004】
しかし、故障利用攻撃や外乱ノイズによりメモリの内容が変化したことを検知したときに、セキュアエレメントの誤動作を防止するため、セキュアエレメントに実装した仮想マシンの動作を停止させると、セキュアエレメントを実装したユーザ機器の動作も停止する可能性がある。
【0005】
そこで、本願で開示する発明では、故障利用攻撃や外乱ノイズによりメモリの内容が変化しても、仮想マシンが誤動作することなく処理を継続できるようにすることを目的とする。
【課題を解決するための手段】
【0006】
上述した課題を解決する第1発明は、仮想マシンを実装したセキュアエレメントである。
第1発明に係るセキュアエレメントに実装する前記仮想マシンは、実行するバイトコードが格納されているメモリアドレスを指し示すプログラムカウンタと、前記プログラムカウンタが指し示すメモリアドレスに格納されたバイトコードを実行するバイトコード処理部を備える。
前記バイトコード処理部は、前記プログラムカウンタを参照してバイトコードをフェッチし、フェッチしたバイトコードをデコードしてバイトコードに応じた命令をディスパッチした後、命令を実行する前に、命令のディスパッチに用いたバイトコードとこの時点の前記プログラムカウンタを参照してフェッチしたバイトコードを比較し、これら2つのバイトコードが同じ場合、バイトコードに応じた命令を実行し、これら2つのバイトコードが異なる場合、バイトコードを実行する処理を再実行する。
第1発明では、バイトコードに対応する命令を実行する前に、バイトコードを再度フェッチし、命令のディスパッチに用いたバイトコードと再度フェッチしたバイトコードを比較することで、実行するバイトコードのメモリアドレスを指し示す前記プログラムカウンタの値が変化したか否かを判定している。更に、前記プログラムカウンタが変化したと判定した場合、前記プログラムカウンタによって示されるバイトコードを再実行することで、前記プログラムカウンタの値が故障利用攻撃や外乱ノイズより変化しても誤動作することなく処理を継続できるようにしている。
【0007】
2つのバイトコードが異なる場合が続く場合、故障利用攻撃や外乱ノイズ以外にハードウェアの故障も想定できる。そこで、第1発明に係る前記バイトコード処理部は、バイトコードを実行する処理を再実行した第1再実行回数をカウントし、前記第1再実行回数が閾値を超えるとエラー処理を実行することが望ましい。
【0008】
条件が成立するか否かにより分岐先を呼び出すか否かを決定する分岐命令は、スタックに格納された2つのデータにおいて分岐命令に対応する条件が成立したか否かを判定する。分岐命令の実行中に、スタックを管理するスタックポインタの値が故障利用攻撃や外乱ノイズより変化すると、分岐命令を実行した後の前記プログラムカウンタが正当ではなくなり誤動作の原因になる。
そこで、第1発明に係る前記バイトコード処理部は、バイトコードに応じた命令が、条件が成立するか否かにより分岐先を呼び出すか否かを決定する分岐命令の場合、前記分岐命令を実行した後に、再度、前記分岐命令を実行し、最初に前記分岐命令を実行したときの前記プログラムカウンタの値と、2回目の前記分岐命令を実行した後の前記プログラムカウンタの値を比較し、これら2つの前記プログラムカウンタの値が異なる場合、前記分岐命令を再実行することが望ましい。
前記分岐命令の場合についても、前記バイトコード処理部は、前記分岐命令を再実行した第2再実行回数をカウントし、前記第2再実行回数が閾値を超えるとエラー処理を実行することが望ましい。
【0009】
上述した課題を解決する第2発明は、セキュアエレメントに実装する仮想マシンである。前記仮想マシンは、実行するバイトコードが格納されているメモリアドレスを指し示すプログラムカウンタと、前記プログラムカウンタが指し示すメモリアドレスに格納されたバイトコードを実行するバイトコード処理部を備える。
第2発明に係る前記バイトコード処理部は、前記プログラムカウンタを参照してバイトコードをフェッチし、フェッチしたバイトコードをデコードしてバイトコードに応じた命令をディスパッチした後、命令を実行する前に、命令のディスパッチに用いたバイトコードとこの時点の前記プログラムカウンタを参照してフェッチしたバイトコードを比較し、これら2つのバイトコードが同じ場合、バイトコードに応じた命令を実行し、これら2つのバイトコードが異なる場合、バイトコードを実行する処理を再実行する。
第2発明においても、前記バイトコード処理部は、バイトコードを実行する処理を再実行した第1再実行回数をカウントし、前記第1再実行回数が閾値を超えるとエラー処理を実行することが望ましい。
更に、第2発明においても、前記バイトコード処理部は、バイトコードに応じた命令が、条件が成立するか否かにより分岐先を呼び出すか否かを決定する分岐命令の場合、前記分岐命令を実行した後に、再度、前記分岐命令を実行し、最初に前記分岐命令を実行したときの前記プログラムカウンタの値と、2回目の前記分岐命令を実行した後の前記プログラムカウンタの値を比較し、これら2つの前記プログラムカウンタの値が異なる場合、前記分岐命令を再実行することが望ましい。
更に、第2発明においても、前記バイトコード処理部は、前記分岐命令を再実行した第2再実行回数をカウントし、前記第2再実行回数が閾値を超えるとエラー処理を実行することが望ましい。
【0010】
第3発明は、セキュアエレメントを実装したICカードである。第3発明に係るICカードに実装した前記セキュアエレメントは仮想マシンを備える。前記仮想マシンは、実行するバイトコードが格納されているメモリアドレスを指し示すプログラムカウンタと、前記プログラムカウンタが指し示すメモリアドレスに格納されたバイトコードを実行するバイトコード処理部を備える。
前記バイトコード処理部は、前記プログラムカウンタを参照してバイトコードをフェッチし、フェッチしたバイトコードをデコードしてバイトコードに応じた命令をディスパッチした後、命令を実行する前に、命令のディスパッチに用いたバイトコードとこの時点の前記プログラムカウンタを参照してフェッチしたバイトコードを比較し、これら2つのバイトコードが同じ場合、バイトコードに応じた命令を実行し、これら2つのバイトコードが異なる場合、バイトコードを実行する処理を再実行する。
第3発明においても、前記バイトコード処理部は、バイトコードを実行する処理を再実行した第1再実行回数をカウントし、前記第1再実行回数が閾値を超えるとエラー処理を実行することが望ましい。
更に、第3発明においても、前記バイトコード処理部は、バイトコードに応じた命令が、条件が成立するか否かにより分岐先を呼び出すか否かを決定する分岐命令の場合、前記分岐命令を実行した後に、再度、前記分岐命令を実行し、最初に前記分岐命令を実行したときの前記プログラムカウンタの値と、2回目の前記分岐命令を実行した後の前記プログラムカウンタの値を比較し、これら2つの前記プログラムカウンタの値が異なる場合、前記分岐命令を再実行することが望ましい。
更に、第3発明においても、前記バイトコード処理部は、前記分岐命令を再実行した第2再実行回数をカウントし、前記第2再実行回数が閾値を超えるとエラー処理を実行することが望ましい。
【発明の効果】
【0011】
上述した通り、本願で開示する発明では、故障利用攻撃や外乱ノイズにより、仮想マシンを実装したセキュアエレメントのメモリに格納するプログラムカウンタが変化しても、仮想マシンが誤動作することなく処理を継続できる。
【図面の簡単な説明】
【0012】
【
図1】セキュアエレメントに係るハードウェアの構成要素を示した図。
【
図2】セキュアエレメントに係るソフトウェア階層構造を示した図。
【
図3】仮想マシンがバイトコードを実行する動作を説明する第1図。
【
図4】仮想マシンがバイトコードを実行する動作を説明する第2図。
【
図5】セキュアエレメントを実装したICカードを示した図。
【発明を実施するための形態】
【0013】
ここから,本願で開示する発明に係る実施形態について記載する。本実施形態は,本願で開示する発明の理解を容易にするためのものであり,本願で開示する発明は,本実施形態に限定されるものではない。また,特に断りのない限り,図面は,本願で開示する発明の理解を容易にするために描かれた模式的な図である。
【0014】
図1は、セキュアエレメント1に係るハードウェアの基本的な構成要素を示す。セキュアエレメント1は、集積回路で作製されている。例えば、
図1では、セキュアエレメント1には、CPU1a(CPU: Central Processing Unit)、ROM1b(ROM: Read Only Memory)、RAM1c(RAM: Random Access Memory)、NVM1d(NVM: Non Volatile Memory)、暗号コプロセッサ1e(Crypto Coprocessor)およびI/F1f(Interface)が集積されている。
図1で図示したセキュアエレメント1において、ROM1b、RAM1c、NVM1d、暗号コプロセッサ1eおよびI/F1fそれぞれは、バス1gを介して、CPU1aと接続している。
【0015】
CPU1aは、セキュアエレメント1における中心的な処理装置である。ROM1bは、電気的に書き換え不可能な不揮発性メモリである。ROM1は、セキュアエレメント1の製造時にのみコンピュータプログラムおよびデータを記憶できるメモリになる。RAM1cは、電気的に書き換え可能な揮発性メモリである。RAM1cは、セキュアエレメント1に実装されたコンピュータプログラムが一時的にデータを記憶するメモリになる。NVM1dは、電気的に書き換え可能な不揮発性メモリである。NVM1dは、セキュアエレメント1の製造後にコンピュータプログラムおよびデータをロードできるメモリになる。セキュアエレメント1のNVM1dには、EEPROMまたはフラッシュメモリなどが利用されている。
【0016】
暗号コプロセッサ1eは、特定の暗号演算に特化して設計された処理装置である。セキュアエレメント1は、秘匿性の高い情報を格納するため、セキュアエレメント1に暗号コプロセッサ1eを備えさせるのが一般的になっている。
【0017】
I/F1fは、外部装置との通信を行う回路である。セキュアエレメント1のI/F1fとしては、I2C(Inter-Integrated Circuit)が有名である。
【0018】
図2では、セキュアエレメント1に係るソフトウェア階層構造を示している。セキュアエレメント1のソフトウェア階層構造は、最下位層から順に、ハードウェア11a、(オペレーティングシステム11c)、仮想マシン10およびアプリケーション11cである。
【0019】
セキュアエレメント1のハードウェア11aが備える基本的な構成要素は、
図1で示している。セキュアエレメント1のハードウェア11aの上層は仮想マシン10になる。仮想マシン10のプログラムコードを記憶させる主のメモリはROM1bになる。ハードウェア11aの上層に仮想マシン10を設ける構造にもできるし、ハードウェア11aの上層にオペレーティングシステム11cを設け、オペレーティングシステム11cの上層に仮想マシン10を設ける構造にもできる。
【0020】
アプリケーション11cは、バイトコードを用いて記述されたコンピュータプログラムである。アプリケーション11cを記憶させる主のメモリはNVM1dになる。バイトコードは、命令を表す1バイトのデータである。バイトコードに応じた命令によっては、パラメータとなる1バイトまたは複数バイトのオペランドがバイトコードに続く。
【0021】
仮想マシン10は、バイトコードを解釈して実行する機能を備えたソフトウェアである。セキュアエレメント1に適した仮想マシン10としては、Java(登録商標) Virtual Machineが有名である。
図2では示していないが、仮想マシン10のランタイム環境(Runtime Environment)や、仮想マシン10のAPI(Application Programming Interface)がセキュアエレメント1に実装される。
【0022】
仮想マシン10は、実行するバイトコードが格納されているメモリアドレスを指し示すプログラムカウンタ100(以下、「PC」と記載する。PCは、Program Counterの略)と、PC100が指し示すメモリアドレスに格納されたバイトコードを実行するバイトコード処理部101を備える。更に、仮想マシン10は、仮想マシン10が対応しているバイトコードごとに、バイトコードに対応する命令102を備える。ここで、命令102とは、命令102に対応する処理を実行するプログラムである。
図2において、仮想マシン10が備える命令102には条件が成立するか否かにより分岐先を呼び出すか否かを決定する分岐命令1020が含まれている。
【0023】
PC100は、セキュアエレメント1のRAM1cに設けられる。また、セキュアエレメント1のRAM1cには、仮想マシン10が使用するスタックとスタックの管理に用いるスタックポインタ(これ以降、「SP」と記す。SPは、Stack Pointerの略)などが設けられる。NVM1dに格納されたデータ(例えば、バイトコード)は故障利用攻撃や外乱ノイズにより変化しづらいが、RAM1cに格納されたデータは故障利用攻撃や外乱ノイズにより変化し易い。故障利用攻撃や外乱ノイズによって、RAM1cに格納したPC100が変化すると、仮想マシン10が誤動作してしまう。そこで、本実施形態では、RAM1cなどのメモリに格納したPC100が故障利用攻撃や外乱ノイズにより変化したか否かを判定する機能と、RAM1cなどのメモリに格納したデータが故障利用攻撃や外乱ノイズより変化しても誤動作することなく処理を継続する機能を仮想マシン10のバイトコード処理部101に持たせている。
【0024】
仮想マシン10が備えるバイトコード処理部101は、バイトコードを実行する際、PC100が指し示しているメモリアドレスからバイトコードをフェッチする処理と、フェッチしたバイトコードをデコードしてバイトコードに応じた命令102をディスパッチする処理と、ディスパッチした命令102を実行する処理をそれぞれ実行する。ここで、ディスパッチとは、命令102に対してリソース(RAM1cの領域など)を割り当てることなどを意味する。
【0025】
バイトコードに応じた命令102を実行させる際、RAM1cに設けたPC100が故障利用攻撃や外乱ノイズより変化すると誤動作が生じる。そこで、本実施形態に係るバイトコード処理部101は、PC100の正当性を判定するため、バイトコードに応じた命令102を実行する前に、命令102のディスパッチに用いたバイトコードとこの時点のPC100を参照してフェッチしたバイトコードを比較する。
【0026】
本実施形態に係るバイトコード処理部101は、PC100の値は正当であると判定すると、すなわち、命令102のディスパッチに用いたバイトコードとこの時点のPC100を参照してフェッチしたバイトコードが同じ場合、ディスパッチした命令102を実行する。また、バイトコード処理部101は、PC100は不当であると判定すると、すなわち、命令102のディスパッチに用いたバイトコードとこの時点のPC100を参照してフェッチしたバイトコードが異なる場合、誤動作することなく処理を継続できるように、バイトコードを実行する処理を再実行する。PC100は正当でない状態が続く場合、ハードウェア11aの故障(例えば、RAM1cの故障)も想定できる。そこで、本実施形態では、バイトコード処理部101は、バイトコードを再実行した第1再実行回数をカウントし、第1再実行回数が閾値を超えると、バイトコードを実行する処理を中断して、所定のエラー処理を実行する。エラー処理の内容は任意でよい。エラー処理は、エラーの発生を示すレスポンスを応答して、バイトコードの実行を終了する処理でもよい。また、エラー処理は、セキュリティ違反を示す例外処理を呼び出す処理でもよい。更に、エラー処理は、セキュアエレメント1の動作を停止する処理でもよい。
【0027】
条件が成立するか否かにより分岐先を呼び出すか否かを決定する分岐命令1020は、スタックに格納された2つのデータにおいて分岐命令1020に対応する条件が成立したか否かを判定する。分岐命令1020の実行中に、スタックを管理するスタックポインタの値やPC100の値が故障利用攻撃や外乱ノイズより変化すると、分岐命令1020を実行した後のPC100が正当ではなくなり誤動作の原因になる。
【0028】
そこで、本実施形態に係るバイトコード処理部101は、分岐命令1020を実行した後に、再度、分岐命令1020を実行し、1回目に分岐命令1020を実行するときのPC100の値と、2回目に分岐命令1020を実行した後のPC100の値を比較して、分岐命令1020を実行した後のPC100の値の正当性を判定する。バイトコード処理部101は、分岐命令1020を実行した後のPC100の値は不当であると判定すると、すなわち、上記の比較でPC100の値が異なる場合、分岐命令1020を再実行する。そこで、本実施形態では、バイトコード処理部101は、分岐命令1020を実行する処理を再実行した第2再実行回数をカウントし、第2再実行回数が閾値を超えると、分岐命令1020を実行する処理を中断して、上述のエラー処理を実行する。
【0029】
図3は、仮想マシン10がバイトコードを実行する動作を説明する第1図、
図4は、仮想マシン10がバイトコードを実行する動作を説明する第2図である。
【0030】
まず、
図3で示した手順について説明する。バイトコードを実行する際、仮想マシン10のバイトコード処理部101は、この時点のPC100が指し示すメモリアドレスに格納されているバイトコードをフェッチする(
図3のステップS1)。なお、
図3および
図4の説明では、ステップS1でメモリからフェッチしたバイトコードをBC1と記載する。
【0031】
次に、仮想マシン10のバイトコード処理部101は、メモリからフェッチしたBC1をデコードして、BC1に対応する命令102を特定する(
図3のステップS2)。仮想マシン10は、BC1に応じた命令102を特定すると、この命令102をディスパッチする(
図3のステップS3)。
【0032】
BC1に応じた命令102をディスパッチすると、BC1に応じた命令102を実行する前に、仮想マシン10のバイトコード処理部101は、PC100の正当性を判定する処理として、この時点のPC100が指し示すメモリアドレスからフェッチしたバイトコードと命令102のディスパッチに用いたBC1を比較する(
図3のステップS4)。
【0033】
図3のステップS4において、BC1が不当であるときの処理について説明する。ステップS4においてBC1が不当である場合、すなわち、この時点のPC100が指し示すメモリアドレスからフェッチしたバイトコードとBC1が異なる場合、バイトコード処理部101は、バイトコードの再実行回数を示す第1再実行回数を一つ増やす(
図3のステップS5)。次に、仮想マシン10は、第1再実行回数が事前に定めた閾値を超えているか判定する(
図3のステップS6)。事前に定めた閾値の値は任意でよい。例えば、閾値は「100」でもよい。第1再実行回数が事前に定めた閾値を超えていない場合、仮想マシン10のバイトコード処理部101は、処理を
図4のステップS1に戻し、最初からバイトコードを再実行する。第1再実行回数が事前に定めた閾値を超えている場合、仮想マシン10は、事前に定められたエラー処理を実行して(
図3のステップS7)、
図3および
図4で示す手順は終了する。
【0034】
図3のステップS4において、BC1が正当であるときの処理について説明する。ステップS4においてBC1が正当である場合、すなわち、この時点のPC100が指し示すメモリアドレスからフェッチしたバイトコードとBC1が同じ場合、第1再実行回数を初期化する(
図3のステップS8)。例えば、仮想マシン10は、第1再実行回数を「0」にする。
【0035】
次に、仮想マシン10は、BC1に対応する命令102が分岐命令1020であるか判定する(
図3のステップS9)。BC1に対応する命令102が分岐命令1020でなければ、仮想マシン10は、ディスパッチした命令102にPC100やSPを引き渡してこの命令102を実行する(
図3のステップS13)。BC1に応じた命令102は、オペランドが命令102に必要な場合、メモリからオペランドを読み出して命令102に係る処理を実行する。
【0036】
ステップS9において、BC1に対応する命令102が分岐命令1020であれば、この時点のPC100の値を保存PC値として保存し(
図3のステップS10)、更に、この時点のSPの値を保存SP値として保存する(
図3のステップS11)。次に、仮想マシン10は、分岐命令1020を実行することを示す分岐命令フラグを立て(
図3のステップS12)、BC1に応じた命令(ここでは、分岐命令1020)を実行する(
図3のステップS13)。
【0037】
ここから、
図4で示した手順について説明する。仮想マシン10のバイトコード処理部101は、
図3のステップS13において実行させた命令102の処理が終了すると、分岐命令フラグが立っているか否かを判定する(
図4のステップS14)。分岐命令フラグが立っていない場合、すなわち、
図3のステップS1でフェッチしたBC1が分岐命令1020でない場合、仮想マシン10のバイトコード処理部101は、
図3および
図4で示した手順を終了する。
【0038】
図4のステップS14において、分岐命令フラグが立っている場合、すなわち、
図3のステップS1でフェッチしたBC1が分岐命令1020の場合、仮想マシン10のバイトコード処理部101は、
図3のステップS10で保存した保存PC値と、
図3のステップS11で保存した保存SP値をそれぞれ読み出す処理を実行する(
図4のステップS15)。次に、仮想マシン10のバイトコード処理部101は、
図4のステップS15で読み出した保存PC100値が指し示すメモリアドレスに格納されているバイトコードをフェッチする(
図4のステップS16)。ここでは、このバイトコードをBC2と記載する。次に、仮想マシン10は、
図4のステップS16でフェッチしたBC2をデコードし、保存PC値および保存SP値を引き渡してBC2に応じた命令102(ここでは、分岐命令1020)を実行する(
図4のステップS17)。分岐命令1020の場合、
図3のステップS13が、1回目の分岐命令1020を実行する処理になり、
図4のステップS17が、2回目の分岐命令1020を実行する処理になる。次に、仮想マシン10のバイトコード処理部101は分岐命令1020を実行した後のPC100の値の正当性を判定するために、この時点のPC100の値と保存PC値を比較する(
図4のステップS18)。
【0039】
図4のステップS18において、PC100の値が不当である場合の処理について説明する。ステップS18において、この時点のPC100の値と保存PC値が同じでないとき、仮想マシン10のバイトコード処理部101は、分岐命令1020の再実行回数を示す第2再実行回数を一つ増やす(
図4のステップS19)。次に、仮想マシン10のバイトコード処理部101は、第2再実行回数が事前に定めた閾値を超えているか判定する(
図4のステップS20)。第2再実行回数が事前に定めた閾値を超えていない場合、仮想マシン10のバイトコード処理部101は、処理を
図4のステップS15に戻し、分岐命令1020を再実行する。なお、処理を
図4のステップS16に戻してもよい。第2再実行回数が事前に定めた閾値を超えている場合、仮想マシン10のバイトコード処理部101は、事前に定められたエラー処理を実行して(
図4のステップS21)、
図3および
図4で示す手順は終了する。
【0040】
図4のステップS18において、PC100の値が正当であるときの処理について説明する。
図4のステップS18において、この時点のPC100の値と保存PC値が同じであるとき、仮想マシン10のバイトコード処理部101は、第2再実行回数を初期化する(
図4のステップS22)。次に、仮想マシン10のバイトコード処理部101は、立っている分岐命令1020フラグを降ろして(
図4のステップS23)、
図3および
図4で示した手順は終了する。
【0041】
これまで説明した仮想マシン10を備えたセキュアエレメント1は、スマートフォンに代表される携帯情報端末に実装できるばかりか、カード媒体にも実装できる。
図5では、セキュアエレメント1を実装したICカード2を示している。
図5(a)では、セキュアエレメント1を実装した接触型ICカード20を示している。
図5(b)では、セキュアエレメント1を実装した非接触型ICカード21を示している。
【0042】
図5(a)で示した通り、セキュアエレメント1を実装した接触型ICカード20は、セキュアエレメント1を実装したコンタクトパッド200を表面に備える。セキュアエレメント1は、コンタクトパット200の裏面に設けられた端子200aの幾つか(ここでは、5個)と電気的に接続している。接触型ICカード20の場合、セキュアエレメント1が備えるI/F1fは、I/Oの端子200aを制御するシリアルI/O回路になる(I/O: Input/Output)。
図5(b)で示した通り、セキュアエレメント1を実装した非接触型ICカード21は、アンテナ210の両端と接続したセキュアエレメント1を内蔵する。非接触型ICカード21の場合、セキュアエレメント1が備えるI/F1fは、アンテナ210の端子間電圧を制御するアナログ通信回路になる。
【符号の説明】
【0043】
1 セキュアエレメント
10 仮想マシン
100 プログラムカウンタ(PC)
101 バイトコード処理部
102 命令
1020 分岐命令
2 ICカード
20 接触型ICカード
21 非接触型ICカード