(57)【要約】従来のアプリケーション保護技術では、アプリケーションを複雑化することで、アプリケーションの解析を困難にしていた。しかし、この方法ではアプリケーションをどれだけ複雑化しても、時間をかけることで解析が可能であった。また、アプリケーションそのものを不正コピーから防ぐことはできない。安全な実行部で動作するメタ情報管理部は、アプリケーションのメタ情報をデバッガからアクセスすることができない領域へ記憶させ、通常の実行部でアプリケーション実行時のためメタ情報が必要になった時に、メタ情報を使い所定の計算をした結果を通常の実行部へ通知することで、アプリケーションのメタ情報を秘匿する。【特許請求の範囲】
【請求項１】
取得したアプリケーションをクラス単位で実行するアプリケーション実行装置であって、
クラスファイルに含まれるメタ情報を記憶するメタ情報記憶手段と、
クラスファイルに含まれる命令列を記憶する命令列記憶手段と、
参照すべき情報のない命令を実行し、参照すべき第１情報があるとき要求し、通知された第２情報を用いて命令を実行する命令実行手段と、
前記命令実行手段の要求に応じて前記メタ情報から第２情報を生成し、前記命令実行手段に通知するメタ情報実行手段とを備え、
前記メタ情報記憶手段に記憶されたメタ情報は、前記メタ情報実行手段だけが読み出すことができ、前記メタ情報実行手段は、前記命令実行手段の要求だけを受け付けることを特徴とするアプリケーション実行装置。
【請求項２】
前記メタ情報記憶手段は、インデックスとコンスタントプールの型とその値とを記載したコンスタントプールと、項目とその値とを記載したクラス構造情報とを記憶し、
前記命令列記憶手段は、クラスで定義されているメソッドのバイトコードを記憶し、
前記メタ情報実行手段は、前記命令実行手段がバイトコードに第１情報であるコンスタントプールのインテックスが指定されている命令を実行するとき、その命令の種類に応じて前記コンスタントプールとクラス構造情報とを参照して第２情報を生成することを特徴とする請求項１記載のアプリケーション実行装置。
【請求項３】
前記命令実行手段が実行するバイトコードが新しいオブジェクトの生成であるとき、
前記メタ情報実行手段は、指定されたインデックスに対応するコンスタントプールの型を前記コンスタントプールから検索し、前記クラス構造情報を参照して、メモリサイズを生成することを特徴とする請求項２記載のアプリケーション実行装置。
【請求項４】
前記命令実行手段が実行するバイトコードがメソッドの呼び出しであるとき、
前記メタ情報実行手段は、指定されたインデックスに対応するコンスタントプールの型を前記コンスタントプールから検索し、前記クラス構造情報を参照して前記メソッドのアドレスを生成することを特徴とする請求項２記載のアプリケーション実行装置。
【請求項５】
前記命令実行手段が実行するバイトコードがオブジェクトのフィールド参照であるとき、
前記メタ情報実行手段は、指定されたインデックスに対応するコンスタントプールの型を前記コンスタントプールから検索し、前記クラス構造情報を参照して、前記フィールドのアドレスを生成することを特徴とする請求項２記載のアプリケーション実行装置。
【請求項６】
前記取得されたアプリケーションは暗号化されており、
前記暗号化されたアプリケーションを復号し、復号された命令列を前記命令列記憶手段に記憶させ、復号されたメタ情報を前記メタ情報記憶手段に記憶させる復号手段を更に備えることを特徴とする請求項１記載のアプリケーション実行装置。
【請求項７】
前記復号手段は、
外部から直接アクセスできない鍵記憶手段に記憶された復号鍵を用いて前記アプリケーションを復号することを特徴とする請求項６記載のアプリケーション実行装置。
【請求項８】
前記アプリケーションは、Ｊａｖａ（登録商標）アプリケーションであることを特徴とする請求項１記載のアプリケーション実行装置。
【請求項９】
取得したアプリケーションをクラス単位で実行するアプリケーション実行装置のアプリケーション実行方法であって、
クラスファイルに含まれるメタ情報を記録するメタ情報記録ステップと、
クラスファイルに含まれる命令列を記録する命令列記録ステップと、
参照すべき情報のない命令を実行し、参照すべき第１情報があるとき要求し、通知された第２情報を用いて命令を実行する命令実行ステップと、
前記命令実行ステップの要求に応じて前記メタ情報から第２情報を生成し、前記命令実行ステップに通知するメタ情報実行ステップとを有し、
前記メタ情報記録ステップに記録されたメタ情報は、前記メタ情報実行ステップだけが読み出すことができ、前記メタ情報実行ステップは、前記命令実行ステップの要求だけを受け付けることを特徴とするアプリケーション実行装置のアプリケーション実行方法。
【発明の詳細な説明】
【技術分野】
【０００１】  本発明は、アプリケーションプログラム（特にＪａｖａ（登録商標）言語で記述されたプログラム）を実行するアプリケーション実行装置に関し、インターネットやＤＶＤ等の外部のメディアからダウンロードしたアプリケーションを実行する時に、アプリケーションが不正に盗聴、改竄されることを防止する技術に関する。
【背景技術】
【０００２】  従来のデジタルＴＶや携帯電話などの電子機器では、Ｊａｖａ（登録商標）言語で記述されたアプリケーションプログラムをダウンロードし、実行する機能を搭載するものが増加している。たとえば携帯電話では、ＮＴＴ  ＤｏＣｏＭｏがｉアプリ（登録商標）と呼ばれるサービスを提供している。このサービスは、携帯電話端末がインターネット上にあるアプリケーション配信サーバからＪａｖａ（登録商標）プログラムをダウンロードして、端末上で実行する。【０００３】  また、欧州では、ＤＶＢ−ＭＨＰ（Ｄｉｇｉｔａｌ  Ｖｉｄｅｏ  Ｂｒｏａｄｃａｓｔｉｎｇ−Ｍｕｌｔｉｍｅｄｉａ  Ｈｏｍｅ  Ｐｌａｔｆｏｒｍ）と呼ばれる仕様が策定され、既に仕様に準拠した運用が開始されている。ＤＶＢ−ＭＨＰ規格に基づくデジタル放送では、放送波に多重化されＪａｖａ（登録商標）プログラムをデジタルＴＶが受信し、それを実行する。【０００４】  このようなアプリケーションプログラム配信サービスにおいて、配信されるアプリケーションプログラムはそのアプリケーションプログラムの開発者の知的財産権で保護されており、これを悪意のある攻撃者が盗聴することは防がなくてはならない。また、悪意のある攻撃者により改ざんされたアプリケーションプログラムが、利用者やアプリ製作者の意図しない動作をすることを防がなくてはならない。【０００５】  近年の電子機器は、多数のソフトウエアモジュールから構成されている。専門的な知識を有する者であれば、これらのソフトウエアモジュールのバグを悪用することで電子機器内のソフトウエアを改ざんすることも可能である。また、デバッガやＩＣＥ（Ｉｎ−Ｃｉｒｃｕｉｔ  Ｅｍｕｌａｔｏｒ）等のツールを用いることでも同様のことは実現可能である。そのため、たとえばＪａｖａ（登録商標）プログラムに著作権管理機能や課金機能が含まれる場合には、これらの機能を無効化できてしまうという問題が発生する。今後、インターネット等を利用したＪａｖａ（登録商標）アプリケーションプログラムの配信ビジネスが本格化するに従い、このようなアプリケーションプログラムの盗聴、改ざんの問題が深刻化すると予想される。【０００６】  従来、ソフトウエアモジュールのバグの悪用や、デバッガ、ＩＣＥなどのツールによってメモリ上のプログラムを解析、改ざんすることを防ぐために、元のプログラムに対し、複雑化と暗号化という方法が用いられている。
複雑化とは、処理の分割、出現順序の交換、条件の挿入などの処理を施すことにより、元のプログラムと動作は同じであるが、より複雑なプログラムへと変換し、プログラム自体を複雑にするという手法であり、暗号化とは、プログラムを暗号化しておき、実行時にだけ復号する方法である。
【特許文献１】特表２００２−５１４３３３
【発明の開示】
【発明が解決しようとする課題】
【０００７】  しかし、複雑化の方法は、どれだけ複雑な変換を施したとしても、時間をかけて解析することでいつかは解析されてしまう。プログラムの金銭的価値が高くなれば、いかに複雑なプログラムであってもそれを解析するためのコストを負担する者が現れるのは必然である。
また、暗号化の方法は、プログラムの実行中は復号されているので、その間に解析、盗聴されてしまう可能性がある。【０００８】  本発明は、上記の問題を解決するもので、ソフトウエアモジュールのバグの悪用や、専門的なツールによるアプリケーションプログラムの盗聴、改ざんを防止するアプリケーション実行装置を提供することを目的とする。
【課題を解決するための手段】
【０００９】  上記課題を解決するため、本発明は、取得したアプリケーションをクラス単位で実行するアプリケーション実行装置であって、クラスファイルに含まれるメタ情報を記憶するメタ情報記憶手段と、クラスファイルに含まれる命令列を記憶する命令列記憶手段と、参照すべき情報のない命令を実行し、参照すべき第１情報があるとき要求し、通知された第２情報を用いて命令を実行する命令実行手段と、前記命令実行手段の要求に応じて前記メタ情報から第２情報を生成し、前記命令実行手段に通知するメタ情報実行手段とを備え、前記メタ情報記憶手段に記憶されたメタ情報は、前記メタ情報実行手段だけが読み出すことができ、前記メタ情報実行手段は、前記命令実行手段の要求だけを受け付けることとしている。
【発明の効果】
【００１０】  上記構成により、アプリケーションの命令を実行する命令実行手段は、参照すべき情報があるとき、メタ情報実行手段に指示して、必要とする第２情報が通知されるので、例えばデバッガを用いて命令実行手段を盗聴したとしても、メタ情報記憶手段に記憶されているメタ情報そのものは見ることが出来ない。したがって、命令実行手段で命令列が盗聴、改ざんされたとしても、アプリケーションの解析は困難であり、盗聴、改ざんを防止することができる。【００１１】  また、前記メタ情報記憶手段は、インデックスとコンスタントプールの型とその値とを記載したコンスタントプールと、項目とその値とを記載したクラス構造情報とを記憶し、前記命令列記憶手段は、クラスで定義されているメソッドのバイトコードを記憶し、前記メタ情報実行手段は、前記命令実行手段がバイトコードに第１情報であるコンスタントプールのインテックスが指定されている命令を実行するとき、その命令の種類に応じて前記コンスタントプールとクラス構造情報とを参照して第２情報を生成することとしている。【００１２】  これにより、アプリケーションの実行時においても、アプリケーションが不正に解析、改ざんされることを防ぐことができ、保護強度が向上する。
また、前記命令実行手段が実行するバイトコードが新しいオブジェクトの生成であるとき、前記メタ情報実行手段は、指定されたインデックスに対応するコンスタントプールの型を前記コンスタントプールから検索し、前記クラス構造情報を参照して、メモリサイズを生成することとしている。【００１３】  これにより、命令実行手段はオブジェクトのサイズを得るが、オブジェクトのサイズの計算の元になった、当該クラスが宣言するメタ情報のフィールドの数と型記述子は命令実行手段には見えない。
また、前記命令実行手段が実行するバイトコードがメソッドの呼び出しであるとき、前記メタ情報実行手段は、指定されたインデックスに対応するコンスタントプールの型を前記コンスタントプールから検索し、前記クラス構造情報を参照して前記メソッドのアドレスを生成することとしている。【００１４】  これにより、命令実行手段はメソッドのアドレスを得るが、当該アドレスを得るのに必要なメタ情報は命令実行手段には見えない。
また、前記命令実行手段が実行するバイトコードがオブジェクトのフィールド参照であるとき、前記メタ情報実行手段は、指定されたインデックスに対応するコンスタントプールの型を前記コンスタントプールから検索し、前記クラス構造情報を参照して、前記フィールドのアドレスを生成することとしている。【００１５】  これにより、命令実行手段はフィールドのアドレスを得るが、当該アドレスを得るのに必要なメタ情報は命令実行手段には見えない。
また、前記取得されたアプリケーションは暗号化されており、前記暗号化されたアプリケーションを復号し、復号された命令列を前記命令列記憶手段に記憶させ、復号されたメタ情報を前記メタ情報記憶手段に記憶させる復号手段を更に備えることとしている。【００１６】  これにより、アプリケーションの復号時においてもアプリケーションのメタ情報を保護することができ、より保護強度が向上する。
また、前記復号手段は、外部から直接アクセスできない鍵記憶手段に記憶された復号鍵を用いて前記アプリケーションを復号することとしている。
これにより、アプリケーションが不正に復号され、解析、改ざんされることを防ぐことができ、保護強度が向上する。【００１７】  また、前記アプリケーションは、Ｊａｖａ（登録商標）アプリケーションであることとしている。
これにより、Ｊａｖａ（登録商標）アプリケーションが不正に盗聴、改ざんされることを防ぐことができる。
また、本発明は、取得したアプリケーションをクラス単位で実行するアプリケーション実行装置のアプリケーション実行方法であって、クラスファイルに含まれるメタ情報を記録するメタ情報記録ステップと、クラスファイルに含まれる命令列を記録する命令列記録ステップと、参照すべき情報のない命令を実行し、参照すべき第１情報があるとき要求し、通知された第２情報を用いて命令を実行する命令実行ステップと、前記命令実行ステップの要求に応じて前記メタ情報から第２情報を生成し、前記命令実行ステップに通知するメタ情報実行ステップとを有し、前記メタ情報記録ステップに記録されたメタ情報は、前記メタ情報実行ステップだけが読み出すことができ、前記メタ情報実行ステップは、前記命令実行ステップの要求だけを受け付けることとしている。【００１８】  上記方法により、デバッガ等のツールによりアプリケーション実行時に、アプリケーションの命令がメモリ上で盗聴、改ざんされたとしても、デバッガ等からはアプリケーションのメタ情報にはアクセスできないので、アプリケーションとしての解析を困難にし、盗聴、改ざんを防止することができる。
【図面の簡単な説明】
【００１９】
【図１】本発明に係るアプリケーション実行装置の実施の形態１の構成図である。
【図２】上記実施の形態のＪａｖａ（登録商標）仮想マシンの構成を示す図である。
【図３】上記実施の形態のＪａｖａ（登録商標）クラスファイルの構造図である。
【図４】上記実施の形態の第１ＲＯＭに記憶されている情報の一例の構成図である。
【図５】上記実施の形態のアプリ取得プログラムの構成の一例の構造図である。
【図６】上記実施の形態のメタ情報の処理手順を示すフローチャートである。
【図７】上記実施の形態の第２ＲＯＭに記憶されている情報の一例の構成図である。
【図８】上記実施の形態のＪａｖａ（登録商標）仮想マシンをロードする処理手順を示すフローチャートである。
【図９】上記実施の形態の復号の処理手順を示すフローチャートである。
【図１０】上記実施の形態のクラスをロードする処理手順を示すフローチャートである。
【図１１】上記実施の形態のＪａｖａ（登録商標）クラスの一例を示す図である。
【図１２】上記実施の形態のコンスタントプールの一例を示す図である。
【図１３】上記実施の形態のクラス構造情報の一例を示す図である。
【図１４】上記実施の形態のバイトコードの一例を示す図である。
【図１５】上記実施の形態のバイトコードのｎｅｗ命令の処理手順を示すフローチャートである。
【図１６】上記実施の形態のクラスＩＤ対応テーブルの一例を表す図である。
【図１７】上記実施の形態のクラスＩＤ対応テーブルの別の一例を表す図である。
【図１８】上記実施の形態のｉｎｖｏｋｅｓｐｅｃｉａｌ命令を実行する際のバイトコードインタプリタおよびメタ情報管理部のフローチャートである。
【図１９】上記実施の形態のｇｅｔｆｉｅｌｄ命令を実行する際のバイトコードインタプリタおよびメタ情報管理部のフローチャートである。
【図２０】本発明に係るアプリケーション実行装置の実施の形態２の構成図である。
【図２１】上記実施の形態の仮想マシンの構成を示す図である。
【図２２】上記実施の形態の第１ＲＯＭに記憶されている情報の一例を示す図である。
【図２３】上記実施の形態のＪａｖａ（登録商標）仮想マシンをロードする処理手順を示すフローチャートである。
【符号の説明】
【００２０】１００，２０００  ダウンロード可能なプログラム
１１０，２０１０  アプリケーション実行装置
１２０，２０２０  通常実行部
１２１，２０２１  アプリ取得プログラム
１２２  Ｊａｖａ（登録商標）仮想マシン
１２３，２０２３  ＯＳ
１２４，２０２４  第１ＣＰＵ
１２５，２０２５  第１ＲＡＭ
１２６，２０２６  第１ＲＯＭ
１３０，２０３０  安全な実行部
１３１，２０３１  メタ情報管理部
１３２，２０３３  Ｊａｖａ（登録商標）仮想マシンローダ
１３３，２０３４  復号処理部
１３４，２０３５  第２ＣＰＵ
１３５，２０３６  第２ＲＡＭ
１３６，２０３７  第２ＲＯＭ
２０１，２１０１  バイトコードインタプリタ
２０２，２１０６  クラスローダ
２０３，２１０７  ベリファイヤ
２０４，２１０３  Ｊａｖａ（登録商標）ヒープ管理部
２０５，２１０４  Ｊａｖａ（登録商標）ネイティライブラリ
２０６，２１０５  ＪＩＴコンパイラ
３００  クラスファイル
３０１  クラス構造情報
３０２  コンスタントプール
３０３  バイトコード
４０１  暗号化されたＪａｖａ（登録商標）仮想マシン
４０２  暗号化されたアプリ取得プログラム
４０３  暗号化されたメタ情報管理部
４０４  起動クラス名
５０１  暗号化されたサブクラス
７０１  復号鍵
１１００  Ｊａｖａ（登録商標）言語によるクラス定義ファイル
１６００  クラスＩＤ対応テーブル（例１）
１７００  クラスＩＤ対応テーブル（例２）
２０２２  第１Ｊａｖａ（登録商標）仮想マシン
２０３２  第２Ｊａｖａ（登録商標）仮想マシン
【発明を実施するための最良の形態】
【００２１】  本発明に係るアプリケーション実行装置の実施の形態を、図面を参照しながら説明する。
（実施の形態１）
図１は、本発明に係るアプリケーション実行装置の実施の形態１の構成図である。
ダウンロード可能なアプリケーションプログラム（以下、単に「アプリケーション」という）１００は、アプリケーション実行装置１１０からダウンロード可能なアプリケーションであり、本実施の形態においては、コンパイルされ、暗号化されたＪａｖａ（登録商標）アプリケーションである。【００２２】  アプリケーション実行装置１１０は、通常実行部１２０と安全な実行部１３０とを備え、仮想線１４０の上方のソフトウェアと下方のハードウェアとで構成される。アプリケーション実行装置１１０は、たとえばデジタルテレビ、セットトップボックス、ＤＶＤレコーダー、Ｂｌｕ−ｒａｙ  Ｄｉｓｃ（ＢＤ）レコーダー、カーナビ端末、携帯電話、ＰＤＡなどの、Ｊａｖａ（登録商標）仮想マシンを搭載する電子機器あるいは端末に摘用される。【００２３】  通常実行部１２０は、ソフトウェアとして、アプリ取得プログラム１２１、Ｊａｖａ（登録商標）仮想マシン１２２、ＯＳ１２３と、ハードウェアとして、第１ＣＰＵ１２４、第１ＲＡＭ１２５、第１ＲＯＭ１２６とから構成される。ここで、アプリ取得プログラム１２１、Ｊａｖａ（登録商標）仮想マシン１２２、ＯＳ１２３の並び順は、ソフトウェアの階層構成の上層からの順を示し、これらのソフトウェアは第１ＣＰＵ１２４で動作する。【００２４】  通常実行部１２０は、たとえば通常のパーソナルコンピュータやデジタル家電機器等に搭載されているプログラム実行手段と同様のものである。なお、請求の範囲では、通常実行部１２０は、命令実行手段及び命令列記憶手段で構成される。
安全な実行部１３０は、ソフトウェアとして、メタ情報管理部１３１、Ｊａｖａ（登録商標）仮想マシンローダ１３２、復号処理部１３３と、ハードウェアとして、第２ＣＰＵ１３４、第２ＲＡＭ１３５、第２ＲＯＭ１３６とから構成される。ここで、メタ情報管理部１３１、Ｊａｖａ（登録商標）仮想マシンローダ１３２、復号処理部１３３の各ソフトウェアは、第２ＣＰＵ１２４で動作する。【００２５】  安全な実行部１３０は、悪意のある第三者からの攻撃を防御しつつ、安全にプログラムを実行させることができる。即ち、安全な実行部１３０は、外部の装置から直接アクセスされることが禁止され、第１ＣＰＵ１２４からの指示に応じて、第２ＣＰＵ１３４は必要な情報を第１ＣＰＵ１２４に通知する。なお、請求の範囲では、安全な実行部１３０は、メタ情報実行手段及びメタ情報記憶手段並びに復号手段で構成される。【００２６】  先ず、通常実行部１２０の各構成要素について説明する。
アプリ取得プログラム１２１は、アプリケーション１００をアプリケーション実行装置１１０の外部から取得し、第１ＲＡＭ１２５に記憶させる。アプリ取得プログラム１２１は、たとえば、インターネット上にあるサーバから、ＴＬＳ（Ｔｒａｎｓｐｏｒｔ  Ｌａｙｅｒ  Ｓｅｃｕｒｉｔｙ）、ＨＴＴＰ（Ｈｙｐｅｒ  Ｔｅｘｔ  Ｔｒａｎｓｆｅｒ  Ｐｒｏｔｏｃｏｌ）等のプロトコルに従いＪａｖａ（登録商標）アプリケーション１００（暗号化され、クラスファイル形式）をダウンロードするＪａｖａ（登録商標）プログラムが相当する。【００２７】  ここで、ＴＬＳは暗号化により通信時のデータの盗聴、改ざんを防ぐデータ転送方式である。ＴＬＳの詳細はＲＦＣ２２４６に記載されており、ここでは詳細な説明を省略する。
また、ＨＴＴＰは、インターネット上のデータ通信で一般的に用いられているデータ転送方式である。ＨＴＴＰの詳細はＲＦＣ２６１６に記載されており、ここでは詳細な説明を省略する。【００２８】  なお、アプリ取得プログラム１２１は、デジタル放送のデータ放送として、ＭＰＥＧ２トランスポートストリーム内に埋め込まれたＪａｖａ（登録商標）アプリケーションをアプリケーション実行装置１１０に読み出すＪａｖａ（登録商標）プログラムであってもよい。ＭＰＥＧ２トランスポートストリームの詳細はＭＰＥＧ規格書ＩＳＯ／ＩＥＣ１３８１８１−１に記載されているので、その説明を省略する。ＭＰＥＧ２トランスポートストリームにＪａｖａ（登録商標）プログラムを埋め込む方法は、ＤＳＭＣＣ方式として、ＭＰＥＧ規格書ＩＳＯ／ＩＥＣ１３８１８１−６に記述されている。ここではＤＳＭＣＣの詳細な説明は省略する。ＤＳＭＣＣ方式は、ＭＰＥＧ２トランスポートストリームのパケットの中に、コンピュータで使用されているディレクトリやファイルで構成されるファイルシステムをエンコードする方法を規定している。【００２９】  また、アプリ取得プログラム１２１は、ＳＤカード、ＣＤ−ＲＯＭ、ＤＶＤ、ＢＤ−ＲＯＭ等のリムーバブルメディアに記録されたＪａｖａ（登録商標）アプリケーションを、第１ＲＡＭ１２５に書き込むＪａｖａ（登録商標）プログラムであってもよい。アプリ取得プログラム１２１はＯＳ１２３が提供するファイル操作機能を用いて、これらのリムーバブルメディアに記録されたＪａｖａ（登録商標）アプリケーションを読み出す。【００３０】  また、アプリ取得プログラム１２１は、アプリケーション実行装置１１０内にある第１ＲＯＭに記録されたＪａｖａ（登録商標）アプリケーションを、第１ＲＡＭ１２５に書き込むＪａｖａ（登録商標）プログラムであってもよい。アプリ取得プログラム１２１はＯＳ１２３が提供するファイル操作機能を用いて、第１ＲＯＭ１２６に記録されたＪａｖａ（登録商標）アプリケーションを読み出す。【００３１】  なお、本実施の形態ではアプリ取得プログラム１２１は、Ｊａｖａ（登録商標）言語で記述されたＪａｖａ（登録商標）プログラムとしているが、同等の機能を有する、ネイティブ（実行装置固有）言語で記述されたプログラムで実現されていてもよい。
Ｊａｖａ（登録商標）仮想マシン１２２は、Ｊａｖａ（登録商標）言語で記述されたプログラムを逐次解析し実行するＪａｖａ（登録商標）バーチャル（仮想）マシンである。Ｊａｖａ（登録商標）言語で記述されたプログラムはバイトコードと呼ばれる、ハードウエアに依存しない中間コードの命令列（オペレーション）にコンパイルされる。Ｊａｖａ（登録商標）仮想マシン１２２は、このバイトコードを解釈、実行するソフトウエアで実現される。また、一部のＪａｖａ（登録商標）仮想マシン１２２は、バイトコードを第１ＣＰＵ１２４が実行可能な実行形式に翻訳するＪＩＴ（Ｊｕｓｔ  Ｉｎ  Ｔｉｍｅ）コンパイラと呼ばれる機能を持つものもある。また、一部のＪａｖａ（登録商標）仮想マシン１２２は、一部のバイトコードを直接実行可能なプロセッサと、プロセッサでは直接実行できないバイトコードを実行するインタプリタから構成されることもある。なお、Ｊａｖａ（登録商標）言語の詳細は、書籍「Ｊａｖａ（登録商標）Ｌａｎｇｕａｇｅ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ（ＩＳＢＮ  ０−２０１−６３４５１−１）」等の多くの書籍で解説されているので、ここでは、その詳細を省略する。【００３２】  Ｊａｖａ（登録商標）仮想マシン１２２は、複数のサブプログラムから構成される。
図２は、Ｊａｖａ（登録商標）仮想マシン１２２を構成するサブプログラムの一例である。
Ｊａｖａ（登録商標）仮想マシン１２２は、図２に示すように、バイトコードインタプリタ２０１、クラスローダ２０２、ベリファイヤ２０３、Ｊａｖａ（登録商標）ヒープ管理部２０４、Ｊａｖａ（登録商標）ネイティブライブラリ２０５、ＪＩＴコンパイラ２０６で構成されている。【００３３】  バイトコードインタプリタ２０１は、クラスファイルに含まれるバイトコードを解釈、実行するサブプログラムで、Ｊａｖａ（登録商標）仮想マシン１２２において中核的な処理を行うサブプログラムである。詳細ついては後述する。
クラスローダ２０２は、アプリ取得プログラム１２１が取得したＪａｖａ（登録商標）アプリケーション１００を、第１ＲＡＭ１２５から読み出し、Ｊａｖａ（登録商標）仮想マシン１２２が実行できるアプリケーションに変換して再度第１ＲＡＭ１２５に書き込み、クラスを実行可能な状態にする。また、クラスローダ２０２は、クラスアンロード処理も行う。クラスアンロード処理とは、実行が終了し不要になったクラスをＪａｖａ（登録商標）仮想マシン１２２から取り除く処理のことである。【００３４】  ここで、クラスとは、Ｊａｖａ（登録商標）アプリケーションを構成する基本単位であり、書籍「Ｊａｖａ（登録商標）Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ（ＩＳＢＮ  ０−２０１−６３４５１−）」で定義されている。
図３は、クラスに含まれる情報の概要を示した図である。
「Ｊａｖａ（登録商標）Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ」での規定では、クラスは図３に示されていない情報もあるが、ここでは説明の簡単化のため本発明に関連のある項目のみ説明する。【００３５】  クラス構造情報３０１は、このクラスが保持するフィールド、メソッド、どのクラスを継承するかなど、クラスの構造に関する情報を含んでいる。
コンスタントプール３０２は、アプリケーション（クラス）で定義されている定数（コンスタント）に関するデータをまとめた情報であり、クラスで定義しているまたはこのクラスから参照している他クラスのフィールド、メソッド、クラスの名前などの情報を含んでいる。クラス構造情報３０１とコンスタントプール３０２とを総称してクラスのメタ情報（または、単にメタ情報）と呼ぶ。【００３６】  バイトコード３０３は、そのクラスにおいて実行されるメソッドの処理を、中間言語の命令の列として記述したものである。バイトコード３０３にはアプリケーションが処理するデータに関する情報は含まれない。したがって、Ｊａｖａ（登録商標）アプリケーションの実行においては、バイトコード３０３だけでは一般的に実行処理ができず、データ部分を定義したコンスタントプール３０２があって始めて実行処理が可能となる。クラスに含まれる上記の各情報の例については、後述する。【００３７】  図２に戻って、ベリファイヤ２０３は、クラスのデータ形式の不備や、クラスに含まれるバイトコードの安全性を判定する。バイトコードの安全性の検査方法は、Ｊａｖａ（登録商標）Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ  Ｓｐｅｃｉｆｉｃａｔｉｏｎで定義されているため詳細な説明は省略する。
ベリファイヤ２０３が妥当ではないと判定されたクラスは、クラスローダ２０２はロードをしない。【００３８】  Ｊａｖａ（登録商標）ヒープ管理部２０４は、Ｊａｖａ（登録商標）ヒープと呼ばれる、Ｊａｖａ（登録商標）アプリケーションが使用するワーキングメモリの確保を行う。Ｊａｖａ（登録商標）ヒープは第１ＲＡＭ１２５内に確保される。また、Ｊａｖａ（登録商標）ヒープ管理部２０４は、ガーベジコレクションも行う。ここで、ガーベジコレクションとは、アプリケーション実行において不要になったワーキングメモリを開放し、他の用途に再利用できるようにする公知の技術をいい、詳細な説明は省略する。【００３９】  Ｊａｖａ（登録商標）ネイティブライブラリ２０５は、Ｊａｖａ（登録商標）アプリケーションから呼び出されるライブラリで、ＯＳ１２３や、アプリケーション実行装置１１０が備える図１には記載されていないハードウエア、サブプログラム等で提供される機能を、Ｊａｖａ（登録商標）アプリケーションへ提供する。
ＪＩＴコンパイラ２０６は、バイトコード３０３を第１ＣＰＵ１２４もしくは第２ＣＰＵ１３４が理解可能な実行形式に翻訳する。【００４０】  以上で、図２に基づく、Ｊａｖａ（登録商標）仮想マシン１２２の概略の説明を終わる。
再び図１に戻って、ＯＳ１２３は、アプリケーション実行装置１１０の電源が投入されると第１ＣＰＵ１２４が起動する基本ソフトウェアである。ＯＳ１２３は、オペレーティングシステムの略であり、Ｌｉｎｕｘが一例である。ＯＳ１２３は、プログラムを平行して実行するカーネル及び、ライブラリで構成される公知の技術の総称であり、詳細な説明は省略する。ＯＳ１２３はＪａｖａ（登録商標）仮想マシン１２２をサブプログラムとして実行する。【００４１】  第１ＣＰＵ１２４は、Ｊａｖａ（登録商標）仮想マシン１２２、ＯＳ１２３、アプリケーション取得プログラム１２１、アプリケーション取得プログラム１２１の実行で取得されたアプリケーション１００の各プログラムに従い処理を実行する。
第１ＲＡＭ１２５は、アプリケーション取得プログラム１２１の実行で取得されたアプリケーションプログラムをクラスファイルとして記憶し、復号されたＪａｖａ（登録商標）仮想マシン１２２を記憶する。また、第１ＣＰＵ１２４が処理を行う際、一時的にデータを保存する。また、第１ＣＰＵ１２４から第２ＣＰＵ１３４に実行を依頼するときの、両ＣＰＵ間のデータの受け渡しに使用される。第１ＲＡＭ１２５は、たとえば、ＳＲＡＭ、ＤＲＡＭ等の一次記憶からなる。【００４２】  第１ＲＯＭ１２６は、暗号化されたＪａｖａ（登録商標）仮想マシン４０１などを記憶する。第１ＣＰＵ１２４から指示されたデータやプログラムを記憶する。第１ＲＯＭ１２６は、具体的にはフラッシュメモリやハードディスク等の不揮発性メモリからなる。
図４は、第１ＲＯＭ１２６が記憶している内容の一例を示す図である。
第１ＲＯＭ１２６は、暗号化されたＪａｖａ（登録商標）仮想マシン４０１、暗号化されたアプリ取得プログラム４０２、暗号化されたメタ情報管理部４０３、起動クラス名４０４を含む。【００４３】  図５は、アプリ取得プログラム４０２の構成を示す図である。
アプリ取得プログラム４０２は、サブクラス５０１〜５０３などの複数のクラスから構成される。各サブクラスは暗号化されている。
起動クラス名４０４は、Ｊａｖａ（登録商標）仮想マシン１２２が起動した際に最初に実行するプログラムであるクラスの名前である。本実施の形態では暗号化起動クラス名４０４にはサブクラス５０１が指定されているものとする。なお、第１ＲＯＭ１２６は図４に示した以外のデータを記憶していてもよい。【００４４】  次に、安全な実行部１３０の各構成要素について説明する。
メタ情報管理部１３１は、Ｊａｖａ（登録商標）仮想マシン１２２にロードされているクラスに含まれるメタ情報を管理し、バイトコードインタプリタ２０１の要求によりその情報を参照処理し、その結果を提供するプログラムである。メタ情報管理部１３１については後に詳細に説明をする。【００４５】  Ｊａｖａ（登録商標）仮想マシンローダ１３２は、アプリケーション実行装置１１０の電源投入後に、第１ＣＰＵ１２４がＪａｖａ（登録商標）仮想マシン１２２を実行可能な状態にするための処理を行う。Ｊａｖａ（登録商標）仮想マシンローダ１３２については後に詳細に説明をする。
復号処理部１３３は、第１ＲＡＭ１２５もしくは第１ＲＯＭ１２６が記憶する暗号化された情報（アプリケーション、Ｊａｖａ（登録商標）仮想マシン１２２等）を復号し、第１ＲＡＭ１２５へ復号結果を書き出すプログラムである。暗号化のためのアルゴリズムは任意の暗号アルゴリズムを用いることが可能である。【００４６】  上記の復号のための鍵は、第２ＲＯＭ１３６に記憶されている復号鍵７０１を使用する。
第２ＣＰＵ１３４は、メタ情報管理部１３１、Ｊａｖａ（登録商標）仮想マシンローダ１３２、復号処理部１３３の各プログラムに従い処理を実行する。
第２ＲＡＭ１３５は、後述のクラス構造情報３０１、コンスタントプール３０２およびクラスＩＤ対応テーブルを記憶する。また、第２ＣＰＵ１３４が処理を行う際、一時的にデータを保存するために使用される。【００４７】  第２ＲＡＭ１３５は、たとえば、ＤＲＡＭやＳＲＡＭ等で構成され第２ＣＰＵ１３４からのみアクセスが可能であり、第１ＣＰＵ１２４から第２ＲＡＭ１３５に記憶された情報を読むことも書くこともできない。なお、第２ＲＡＭ１３５はＣＰＵ１３４に混載されていてもよい。
通常実行部１２０で動作するプログラム、たとえばＪａｖａ（登録商標）仮想マシン１２２と安全な実行部１３０で動作するプログラム、たとえばメタ情報管理部１３１は、共同して動作するため、両者の間で情報の交換が必要となる。【００４８】  図６は、Ｊａｖａ（登録商標）仮想マシン１２２が、たとえばメタ情報管理部１３１に処理を指示するときのフローチャートである。
図６において、Ｊａｖａ（登録商標）仮想マシン１２２は、メタ情報管理部１３１に渡す情報を、第１ＲＡＭ１２５の所定のアドレスへ記憶させる（Ｓ６０１）。次に、Ｊａｖａ（登録商標）仮想マシン１２２は、第１ＣＰＵ１２４を通じて第２ＣＰＵ１３４へ、メタ情報管理部１３１の実行を指示する（Ｓ６０２）。メタ情報管理部１３１は、第１ＲＡＭ１２５の所定のアドレスから、Ｊａｖａ（登録商標）仮想マシン１２２がＳ６０１で記憶されたデータを読み出し（Ｓ６０３）、そのデータを用いて所定の処理を行う（Ｓ６０４）。【００４９】  次に、メタ情報管理部１３１は、Ｓ６０４で得られた処理結果を第１ＲＡＭ１２５の所定のアドレスへ書きこむ（Ｓ６０５）。次に、メタ情報管理部１３１は、第２ＣＰＵ１３４を通じて第１ＣＰＵ１２４へＪａｖａ（登録商標）仮想マシン１２２の実行を指示する（Ｓ６０６）。次に、Ｊａｖａ（登録商標）仮想マシン１２２は第１ＲＡＭ１２５の所定のアドレスから、メタ情報管理部１３１がＳ６０４で行なった処理の結果を読みだす。【００５０】  以上のように実行することで、第１ＣＰＵ１２４からは直接参照することができない情報に基づく処理を、安全な実行部１３０内で動作するプログラムに指示して情報を受け渡しできる。
第２ＲＯＭ１３６は、読み出し専用の不揮発性メモリからなり、第２ＣＰＵ１３４以外からは第２ＲＯＭ１３６が記憶する情報を読みだすことが出来ないことを保証する。【００５１】  図７は、第２ＲＯＭ１３６が記憶する情報の一例を示す図である。
図７の第２ＲＯＭ１３６には、第１ＲＯＭ１２６が記憶するＪａｖａ（登録商標）仮想マシン４０１，アプリ取得プログラム４０２に含まれるサブクラス５０１〜５０３を復号するための復号鍵７０１を記憶している。本実施の形態では、Ｊａｖａ（登録商標）仮想マシン４０１、アプリ取得プログラム４０２、起動クラス名４０４を復号する鍵は、復号鍵７０１一つのみとしているが、それぞれに別々の鍵を用いても本発明は実施可能である。なお、第２ＲＯＭ１３６は図７に示されていない別のデータを記憶していてもよい。【００５２】  また、復号鍵７０１は、アプリ取得プログラム１２１で取得された暗号化されたアプリケーション１００の復号のための暗号化された復号鍵を復号するために用いられる。アプリケーション１００の復号された復号鍵も第２ＲＯＭ１３６に記憶される。
なお、本実施の形態では、アプリケーション実行装置１１０は二つのＣＰＵを備えているが、一つのＣＰＵが動作モードを切り替えるなどの方法で仮想的に二つのＣＰＵのように振舞ってもよい。動作モードを変えることが可能なＣＰＵには、たとえばＩｎｔｅｌ社のＬａＧｒａｎｄｅがある。このＣＰＵは通常モードとセキュアモードと呼ばれる２つの動作モードを持つ。通常モード側で動作するプログラムからは、セキュアモード上で動くプログラムを盗聴、改ざんすることができないように構成されている。同様の機能を持ったＣＰＵはＡＲＭ社やＡＭＤ社からも発表されている。【００５３】  なお、本実施の形態では、メタ情報管理部１３１、Ｊａｖａ（登録商標）仮想マシンローダ１３２、復号処理部１３３は第２ＣＰＵ１３４で実行されるプログラムとしているが、ＬＳＩでこれらの機能を実現してもよい。
また、第１ＲＡＭ１２５、第２ＲＡＭ１３５は、一つのＲＡＭを仮想的に２つのＲＡＭとして扱ったものとしてもよく、また、第１ＲＯＭ１２６、第２ＲＯＭ１３６は一つのＲＯＭを仮想的に２つのＲＯＭとして扱ったものとしてもよい。【００５４】  また、安全な実行部１３０全体、もしくは一部をハードウエアにより実現してもよい。この場合、第１ＣＰＵ１２４と第２ＣＰＵ１３４間のデータ通信は暗号化して行い、第三者による盗聴を防ぐ。これは両ＣＰＵを結ぶデータバス（図示されていない）にデータを送信する際に暗号化し、データを受信後に復号することで行われる。
また、安全な実行部１３０は、スマートカードやＩＣカードのように、アプリケーション実行装置１１０から取り外し可能な装置であってもよい。スマートカード、ＩＣカードはカード内部にＣＰＵやメモリ、セキュリティ回路を含む公知の技術であり、詳細な説明を省略する。この場合、通常実行部１２０と安全な実行部１３０間のデータ転送は、ＳＡＣ（Ｓｅｃｕｒｅ  Ａｕｔｈｅｎｔｉｃａｔｅｄ  Ｃｈａｎｎｅｌ）等の技術を用いて、第三者による盗聴を防ぎながら行うようにする。ＳＡＣはＩＣカードと外部機器の相互認証、および暗号鍵の共有を安全に行うための公知の技術である。【００５５】  また、安全な実行部１３０のソフトウェアは、耐タンパソフトウエア技術により保護されたソフトウエアであってもよい。
次に、アプリケーション実行装置１１０がＪａｖａ（登録商標）アプリケーションを盗聴、改ざんから保護しながら実行する方法について説明する。
Ｊａｖａ（登録商標）アプリケーション実行装置１１０の電源が投入されると、第１ＣＰＵ１２４は、ＯＳ１２３を起動する。ＯＳ１２３は起動後、第１ＣＰＵ１２４を通じて第２ＣＰＵ１３４に対し、Ｊａｖａ（登録商標）仮想マシンローダ１３２をロードするよう指示する。第２ＣＰＵ１３４によって起動されたＪａｖａ（登録商標）仮想マシンローダ１３２は、一定の手順でＪａｖａ（登録商標）仮想マシン１２２を第１ＲＡＭ１２５へ、メタ情報管理部１３１を第２ＲＡＭ１３５へロードする。【００５６】  図８は、Ｊａｖａ（登録商標）仮想マシン１２２およびメタ情報管理部１３１をロードする手順を示した図である。
図８において、Ｓ８０１で、Ｊａｖａ（登録商標）仮想マシンローダ１３２は復号処理部１３３を使い、第１ＲＯＭ１２６に記憶されたＪａｖａ（登録商標）仮想マシン４０１を第１ＲＡＭ１２５へ復号する。【００５７】  図９は、復号処理部１３３が、暗号化されたＪａｖａ（登録商標）仮想マシン４０１を復号する際の処理手順を示す図である。
図９において、復号処理部１３３は、第１ＲＯＭ１２６が記憶する暗号化されたＪａｖａ（登録商標）仮想マシン４０１を、第２ＣＰＵ１３３を通じて読み出す（Ｓ９０１）。
復号処理部１３３は、第２ＲＯＭ１３６から復号鍵７０１を取得し（Ｓ９０２）、Ｊａｖａ（登録商標）仮想マシン４０１の復号結果の出力先を判定する。（Ｓ９０３）出力先が第１ＲＡＭのとき、復号されたＪａｖａ（登録商標）仮想マシン１２２を、第２ＣＰＵ１３４を通じて第１ＲＡＭ１２５に（Ｓ９０４）、また、出力先が第２ＲＡＭのとき、第２ＲＡＭ１３５に記憶させる（Ｓ９０５）。【００５８】  図８に戻って、Ｊａｖａ（登録商標）仮想マシンローダ１３２は、復号処理部１３３に指示して、第１ＲＯＭ１２６に記憶されたメタ情報管理部４０４を、第２ＲＡＭ１３５へ復号する（Ｓ８０２）。Ｊａｖａ（登録商標）仮想マシンローダ１３２は、ＯＳ１２３へロードの完了を通知する。（Ｓ８０３）
ＯＳ１２３は、Ｊａｖａ（登録商標）仮想マシンローダ１３２からロード完了通知を受け、Ｊａｖａ（登録商標）仮想マシン１２２の実行を開始する。Ｊａｖａ（登録商標）仮想マシン１２２の実行が開始されると、クラスローダ２０２が呼び出され、クラスローダ２０２は、図４で示す第１ＲＯＭ１２６に記憶されている起動クラス名４０４を参照し、起動クラス名４０４で指定されたクラスをロードする。【００５９】  図１０は、起動クラス名４０４として、図５のアプリ取得プログラム４０２のサブクラス５０１が指定されていたときを例に、クラスローダ２０２がサブクラス５０１をロードする処理手順を示したフローチャートである。
まず、クラスローダ２０２は、復号処理部１３３に指示し、第１ＲＯＭ１２６に記憶されている暗号化されたサブクラス５０１の復号処理を行わせる（Ｓ１００１）。次に、ベリファイヤ２０３に指示し、第１ＲＡＭ１２５の復号されたサブクラスをベリファイさせる（Ｓ１００２）。クラスローダ２０２は、第１ＲＡＭ１２５の復号されたサブクラスからメタ情報（クラス構造情報３０１、コンスタントプール３０２）を抽出し（Ｓ１００３）、抽出後はサブクラスからメタ情報を削除して、当該メタ情報を第１ＲＡＭ１２５に書き出し、メタ情報管理部１３１を呼び出す（Ｓ１００４）。メタ情報管理部１３１は、第１ＲＡＭ１２５からメタ情報を読み取り、第２ＲＡＭ１３５へコピーする。クラスローダ２０２は、メタ情報管理部１３１によるメタ情報のコピーが終わると、第１ＲＡＭ１２５から当該メタ情報を削除する（Ｓ１００５）。【００６０】  以上のようにして、クラスローダ２０２は、アプリ取得プログラムだけではなく、アプリ取得プログラム１２１で取得されたアプリケーションのクラスについても同様な処理を行い、クラスのメタ情報を、安全な第２ＲＡＭ１３５へのみ記憶させる。
上記のように構成することにより、アプリケーションの実行時に、クラスのメタ情報はデバッガ等では読み出すことも書き込むこともできない領域へ記憶することができる。【００６１】  次に、バイトコードインタプリタ２０１、メタ情報管理部１３１が、クラスを盗聴、改ざんから保護しながら実行する処理の例について説明する。なお、クラスの構造やバイトコードインタプリタ２０１の動作は「Ｊａｖａ（登録商標）Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ」で詳細に説明されているため、本実施の形態に関連の深い箇所のみを簡単に説明する。【００６２】  図１１はＪａｖａ（登録商標）言語により記述されたクラスファイルの一例を示す図である。
クラス名１１０１は、このクラスの名前であり、例ではクラスの名前はＳａｍｐｌｅである。フィールド１１０２はＳａｍｐｌｅクラスが定義するフィールドである。フィールド１１０２は、メソッド実行時の計算結果の値を記憶させる領域として使うことができる。メソッド１１０３およびメソッド１１０４は、Ｓａｍｐｌｅクラスで定義されている２つのメソッドである。ここで、メソッドとは、クラスの処理内容を定義したものである。【００６３】  Ｊａｖａ（登録商標）言語でクラスを定義したソ−スファイル１１００は、Ｊａｖａ（登録商標）コンパイラによりクラスファイル３００に変換される。変換されたクラスファイル３００は、クラス構造情報３０１、コンスタントプール３０２、バイトコード３０３から構成される。
図１２は、クラス１１００がコンパイルされたときのクラスファイル３００のコンスタントプール３０２を示す図である。【００６４】  列１２０１は、コンスタントプール３０２のエントリ番号を示すインデックスであり、コンスタントプール３０２の参照はインデックスで表現する。列１２０２はコンスタントプールの型である。コンスタントプールは、記録する情報の種類に応じて型が決められている。列１２０３はコンスタントプールの値である。
たとえば、インデックス１は、インデックス３のクラスで宣言されているクラスにおいて、インデックス１３の示すメソッドへの参照であることを意味する。インデックス３は、ＣＯＮＳＴＡＮＴ＿Ｃｌａｓｓはクラスへの参照を表している。インデックス３は、インデックス１５の名前を持ったクラスへの参照であり、インデックス１５のＣＯＮＳＴＡＮＴ＿Ｕｔｆ８は、クラス、メソッド、フィールドの名前を表している。インデックス１５の例ではクラスの名前は“Ｓａｍｐｌｅ”である。インデックス１３のＣＯＮＳＴＡＮＴ＿ＮａｍｅＡｎｄＴｙｐｅは、メソッドやフィールドの名前と型記述子の参照を表す。型記述子とは、フィールドの型や、メソッドの引数、戻り値の型を文字列で表現したものである。インデックス１３の例では、このコンスタントプール３０２は名前がインデックス８、型記述子がインデックス１８である。その値は、それぞれ”＜ｉｎｉｔ＞“、”（）Ｖ“である。つまり、インデックス１のメソッド参照は、名前が”＜ｉｎｉｔ＞“で型記述子が”（）Ｖ“であるメソッドへの参照になる。また、インデックス２のＣＯＮＳＴＡＮＴ＿ＦｉｅｌｄＲｅｆはこのコンスタントプール３０２がフィールドへの参照であることを表している。インデックス２は、クラス”Ｓａｍｐｌｅ“で定義された、名前が”ｆｉｅｌｄ“で、型記述子が”Ｉ“のフィールドを参照している。【００６５】  図１３は、クラス１１００のクラス構造情報３０１の一部である。ｔｈｉｓ＿ｃｌａｓｓ１３０１はクラス１１００の名前への参照である。クラスの名前はコンスタントプール３０２のインデックス１５に記録されている。ｓｕｐｅｒ＿ｃｌａｓｓ１３０２は、クラス１１００の親クラスである。ｆｉｌｅｄ＿ｃｏｕｎｔ１３０３は、クラス１１００で定義されているフィールドの数を表す。フィールドは、メソッドの処理結果などを記憶させることができる領域である。フィールド情報１３０４は、クラス１１００で定義されているフィールドの名前、アクセス権などの情報が記録されている。ｍｅｔｈｏｄ＿ｃｏｕｎｔ１３０５は、クラス１１００で定義されているメソッドの数を表す。メソッド情報１３０６は、クラス１１００で定義されているメソッドの名前、バイトコードのアドレスなどが記録されている。【００６６】  図１４は、クラス１１００で定義されているメソッド１１０４のバイトコード３０３である。バイトコード３０３からは、コンスタントプール３０２を使いクラス、フィールド、メソッドへアクセスする。たとえば、命令１４０１ではインデックス３のコンスタントプール３０２を参照している。
バイトコードインタプリタ２０１は、バイトコード３０３の実行時に、コンスタントプール３０２を参照している命令、つまり図１４で＃の記号によりコンスタントプール３０２のインデックスを指定している命令があると、メタ情報管理部１３１にコンスタントプール解決処理を依頼し、コンスタントプール解決処理により得られた情報を用いて命令の処理をする。バイトコードインタプリタ２０１は、コンスタントプール３０２のインデックスを指定していない命令は独自に実行する。ここで、コンスタントプール解決処理とは、コンスタントプール３０２において文字列で表現されているクラス、フィールド、メソッドが第１ＲＡＭ１２５内のどのアドレスに記憶されているかを調べる処理のことである。【００６７】  図１５は、図１４の命令１４０１を実行する処理のフローチャートである。
図１５において、バイトコードインタプリタ２０１は、命令１４０１をフェッチする。命令１４０２は、コンスタントプール３０２のインデックス３の位置に記憶されているクラス型のオブジェクトを生成する命令である。コンスタントプール３０２は、第２ＲＡＭ１３５が記憶しているため、バイトコードインタプリタ２０１はコンスタントプール３０２へアクセスできない。そのため、バイトコードインタプリタ２０１はメタ情報管理部１３１へ、命令１４０１の内容を通知する。（Ｓ１５０１）。メタ情報管理部１３１は、命令１４０１を読み出し、命令１４０１が参照するインデックス３で、第２ＲＡＭ１３５が記憶するコンスタントプール３０２を検索する（Ｓ１５０２）。本実施の形態では、クラス名“Ｓａｍｐｌｅ”が得られる。【００６８】  次に、メタ情報管理部１３１は、“Ｓａｍｐｌｅ”クラスのクラス構造情報３０１からオブジェクトのサイズを計算する。（Ｓ１５０３）。ここで、オブジェクトのサイズは、そのクラスが宣言するフィールドの数と型記述子から計算される。たとえば“Ｓａｍｐｌｅ”クラスの場合ｉｎｔ型のフィールドを１つ持つため、オブジェクトサイズは４（バイト）になる。【００６９】  次に、メタ情報管理部１３１は“Ｓａｍｐｌｅ”クラスを表すクラスＩＤを生成する（Ｓ１５０４）。クラスＩＤは、生成されたオブジェクトがどのクラスから生成されたのかを識別するために用いる情報である。クラスＩＤはたとえば３２ビットの整数値を用いて実現できる。メタ情報管理部１３１は、クラスＩＤと、クラス名で代表するクラス構造情報３０１との対応関係を、第２ＲＡＭ１３４が記憶するクラスＩＤ対応テーブルに記憶させる。【００７０】  図１６は、クラスＩＤ対応テーブルの一例を示す図である。列１６１０はクラス名を表しており、列１６１１はクラスＩＤを表している。たとえば行１６０１の例では“Ｓａｍｐｌｅ”のクラス名で代表するクラス構造情報３０１は、クラスＩＤが１と対応付けられていることを表している。
図１５に戻って、メタ情報管理部１３１は、Ｓ１５０３で計算したオブジェクトサイズと、Ｓ１５０４で生成したクラスＩＤを第１ＲＡＭ１２５へ記憶させ、バイトコードインタプリタ２０１へ通知する（Ｓ１５０５）。その後、バイトコードインタプリタ２０１は通知されたオブジェクトサイズ分のメモリを確保し（Ｓ１５０６）、オブジェクトヘッダに通知されたクラスＩＤを記録する（Ｓ１５０７）。ここで、オブジェクトヘッダは、オブジェクトに関する様々な情報を記録する領域である。【００７１】  以上の処理により、バイトコードインタプリタ２０１は、メタ情報を知ることなく、命令１４０１を実行することができる。この時、悪意のある第三者がコンスタントプール３０２の内容の盗聴を試みても、コンスタントプール３０２は第２ＲＡＭ１３５に記録されているため盗聴することができない。また、悪意のある第三者がバイトコードインタプリタ２０１とメタ情報管理部１３１間の通信内容を盗聴したとしても、コンスタントプール３０２のインデックスと、確保すべきオブジェクトサイズが得られるだけであり、コンスタントプールの内容は漏洩しない。つまり、悪意のある第三者からコンスタントプール３０２の内容を秘匿することができる。【００７２】  なお、クラスＩＤ対応テーブル１６００において、クラスＩＤとクラス構造情報３０１の対応は必ずしも１対１である必要はない。
図１７は、ひとつのクラス構造情報３０１に対し複数のクラスＩＤが対応する例を示す図である。このように構成することにより、デバッガなどのツールが第１ＲＡＭ１２５を盗聴したときに、どのオブジェクトがどのクラスに対応するものか解析することが困難になる。【００７３】  続いて、命令１４０２〜命令１４０３は、コンスタントプール３０２への参照を含まないため、バイトコードインタプリタ２０１はメタ情報管理部１３１を呼び出すことなく命令を実行することができる。命令１４０４は、コンスタントプール３０２への参照を伴う命令である。命令１４０４は、第２ＲＡＭ１３５が記憶するコンスタントプール３０２のインデックス２の位置に記憶されているクラス名、メソッド名で表されるメソッドのバイトコードを呼び出す命令である。【００７４】  図１８は、バイトコードインタプリタ２０１が、命令１４０４を実行する処理のフローチャートである。
バイトコードインタプリタ２０１は、命令１４０４をフェッチし、命令１４０４の内容と、レシーバオブジェクトのアドレスをメタ情報管理部１３１へ通知する（Ｓ１８０１）。【００７５】  ここで、レシーバオブジェクトとは、メソッドを実行する対象のオブジェクトのことである。Ｊａｖａ（登録商標）言語では、メソッドの処理はレシーバオブジェクトが記憶するフィールドを用いて行われる。メタ情報管理部１３１は、レシーバオブジェクトのオブジェクトヘッダに記憶されているクラスＩＤを、第２ＲＡＭ１３４が記憶するクラスＩＤ対応テーブル１６００から検索し、クラスＩＤに対応するクラス構造情報３０１を検索する（Ｓ１８０２）。図１６に示すように、クラスＩＤは「１」であるので、図１３のクラス構造情報３０１が検索される。【００７６】  次に、メタ情報管理部１３１は、コンスタントプール３０２からインデックス４を検索し、メソッド名“＜ｉｎｉｔ＞”と型記述子”（）Ｖ“を得る（Ｓ１８０３）。次に、メタ情報管理部１３１は、Ｓ１８０２で検索したクラス構造情報３０１に含まれるメソッド情報１３０６から、Ｓ１８０３で検索したメソッド名と型記述子を持つメソッドを検索し、そのバイトコードアドレスを得る（Ｓ１８０４）。次に、メタ情報管理部１３１は、Ｓ１８０４で得たバイトコードアドレスをインタプリタ２０１へ通知する（Ｓ１８０５）。バイトコードインタプリタ２０１は、メタ情報管理部１３１から通知されたバイトコードアドレスを実行する（Ｓ１８０６）。【００７７】  以上の動作によりバイトコードインタプリタ２０１は、メタ情報を知ることなく命令１４０４を実行することができる。この時、悪意のある第三者がコンスタントプール３０２の内容の盗聴を試みても、コンスタントプール３０２は第２ＲＡＭ１３５に記録されているため盗聴することができない。また、悪意のある第三者がバイトコードインタプリタ２０１とメタ情報管理部１３１間の通信内容を盗聴したとしても、コンスタントプール３０２のインデックスと、次に実行すべきバイトコードアドレスが得られるだけであり、コンスタントプールの内容は漏洩しない。つまり、悪意のある第三者からコンスタントプール３０２の内容を秘匿することができる。【００７８】  続いて、命令１４０５〜命令１４０６は、コンスタントプール３０２への参照を含まないため、バイトコードインタプリタ２０１はメタ情報管理部１３１を呼び出すことなく命令を実行することができる。
命令１４０７は、コンスタントプール３０２への参照を伴う命令である。命令１４０７は、第２ＲＡＭ１３５が記憶するコンスタントプール３０２のインデックス２の位置に記憶されている、クラス名、フィールド名で表されるフィールドを読み出す命令である。コンスタントプール３０２は、第２ＲＡＭ１３５が記憶しているため、バイトコードインタプリタ２０１はコンスタントプール３０２へアクセスできない。図１９は、バイトコードインタプリタ２０１が、命令１４０７を実行する処理のフローチャートである。【００７９】  バイトコードインタプリタは命令１４０７をフェッチすると、メタ情報管理部１３１を呼び出し、命令１４０７の内容と、命令１４０７の実行直前のＪａｖａ（登録商標）スタックの最上位にあるオブジェクトのアドレスを通知する（Ｓ１９０１）。
ここで、Ｊａｖａ（登録商標）スタックについては「Ｊａｖａ（登録商標）Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ」を参照されたい。【００８０】  メタ情報管理部１３１は、通知されたオブジェクトのオブジェクトヘッダに記憶されているクラスＩＤを、第２ＲＡＭ１３４が記憶するクラスＩＤ対応テーブル１６００から検索し、クラスＩＤに対応するクラス構造情報３０１を検索する。（Ｓ１９０２）本実施の形態では、クラスＩＤは「１」であるので、クラス構造情報３０１が検索される。
次に、メタ情報管理部１３１は、コンスタントプール３０２からインデックス２を検索し、フィールド名“ｆｉｅｌｄ”と型記述子”Ｉ“を得る。（Ｓ１９０３）次に、メタ情報管理部１３１は、Ｓ１９０２で検索したクラス構造情報３０１に含まれるフィールド情報１３０４から、Ｓ１９０３で検索したフィールド名と型記述子を持つフィールドを検索し、そのフィールドのアドレスを得る。（Ｓ１９０４）次に、メタ情報管理部１３１は、第１ＲＡＭ１２５へ、Ｓ１９０４で得たフィールドアドレスを記憶させ、バイトコードインタプリタ２０１へそのアドレスを通知する（Ｓ１９０５）。バイトコードインタプリタ２０１は、メタ情報管理部１３１から通知されたフィールドアドレスを読み取る（Ｓ１９０６）。【００８１】  以上の動作により、バイトコードインタプリタ２０１は、メタ情報を知ることなく命令１４０７を実行することができる。この時、悪意のある第三者がコンスタントプール３０２の内容の盗聴を試みても、コンスタントプール３０２は第２ＲＡＭ１３５に記録されているため盗聴することができない。また、悪意のある第三者がバイトコードインタプリタ２０１とメタ情報管理部１３１間の通信内容を盗聴したとしても、コンスタントプール３０２のインデックスと、データを読み出すためのフィールドのアドレスが得られるだけであり、コンスタントプールの内容は漏洩しない。つまり、悪意のある第三者からコンスタントプール３０２の内容を秘匿することができる。【００８２】  以上に説明したように、メタ情報（クラス構造情報３０１、コンスタントプール３０２）はデバッガからアクセスすることができない第２ＲＡＭ１３４のみが記憶するため、悪意のある第三者がデバッガなどのツールを使ってＪａｖａ（登録商標）アプリケーションの不正コピーを試みても、メタ情報が取得できない。また、Ｊａｖａ（登録商標）アプリケーションの実行時に、データの盗聴、改ざんを試みても、メタ情報を読み出すことができないため、どのメソッドやデータを盗聴、改ざんすればよいかが分からず、攻撃が非常に困難になる。【００８３】  なお、アプリ取得プログラム１２１、Ｊａｖａ（登録商標）仮想マシン１２２は、第１ＣＰＵ１２４で実行されるソフトウェアで実現されるとしたけれども、ＬＳＩ等のハードウェアで実現されてもよいのは勿論である。
（実施の形態２）
上記実施の形態１では、クラスローダ２０２やベリファイヤ２０３はＪａｖａ（登録商標）仮想マシン１２２のサブプログラムとして通常実行部１２０で動作している。このため、図１０に示したクラスロード処理のＳ１００１完了後から、Ｓ１００５までの間にデバッガ等のツールで第１ＲＡＭ１２５を盗聴することで、メタ情報が漏洩する課題がある。本実施の形態２では、クラスローダ２０２、ベリファイヤ２０３を安全な実行部１３０で動作させることによりこの課題を解決する。【００８４】  図２０は、実施の形態２におけるアプリケーション実行装置の構成を示すブロック図である。
本実施の形態におけるアプリケーション実行装置２０１０は、実施の形態１におけるアプリケーション実行装置１１０と比べ、第１Ｊａｖａ（登録商標）仮想マシン２０２２、第２Ｊａｖａ（登録商標）仮想マシン２０３２、復号処理部２０３４が異なる。その他の構成要素については、実施の形態１と同様であるため説明を省略する。【００８５】  図２１は、第１Ｊａｖａ（登録商標）仮想マシン２０２２、第２Ｊａｖａ（登録商標）仮想マシン２０３２のサブプログラムの構成を示す図である。
クラスローダ２１０６、ベリファイヤ２１０７は、安全な実行部２０３０で実行するため第２Ｊａｖａ（登録商標）仮想マシン２０３２のサブプログラムとする。
また、図２２に示すように、第１ＲＯＭ２０２６は、第１Ｊａｖａ（登録商標）仮想マシン２２０１、第２Ｊａｖａ（登録商標）仮想マシン２２０２を記憶している。【００８６】  図２３は、Ｊａｖａ（登録商標）仮想マシンローダ２０３３が、第１Ｊａｖａ（登録商標）仮想マシン２０２２、第２Ｊａｖａ（登録商標）仮想マシン２０３２をロードする処理手順を示すフローチャートである。
図２３のＳ２３０１で、Ｊａｖａ（登録商標）仮想マシンローダ２０３３は、復号処理部２０３４へ、第１Ｊａｖａ（登録商標）仮想マシン２２０１を復号し、結果を第１ＲＡＭ２０３６へ出力するよう指示する。【００８７】  そして、Ｊａｖａ（登録商標）仮想マシンローダ２０３３は、復号処理部２０３４に対し、第２Ｊａｖａ（登録商標）仮想マシン２２０２を復号し、結果を第２ＲＡＭ２０３６へ出力するよう指示する（Ｓ２３０２）。最後に、ＯＳ２０２３へロードの完了を通知する（Ｓ２３０３）。
以上でＪａｖａ（登録商標）仮想マシンをロードすることができる。【００８８】  クラスのロード処理は、クラスローダ２１０６、ベリファイヤ２１０７の動作を安全な実行部２０１０で実行すること以外は、実施の形態１と同様のため説明を省略する。また、クラスの実行処理も、実施の形態１と同様であるため説明を省略する。
以上のように構成することにより、クラスのロード処理の処理中のときでも、復号されたメタ情報のデバッガなどのツールによる盗聴、改ざんを防ぐことができる。【００８９】  なお、実施の形態１および実施の形態２ではＪａｖａ（登録商標）アプリケーションを実行するアプリケーション実行装置を例に説明したが、本発明はメタ情報を持つ他の言語で記述されたアプリケーションにも適用が可能である。たとえば、ＥＣＭＡで標準化されているＣ＃言語は、ＣＩＬ（Ｃｏｍｍｏｎ  Ｉｎｔｅｒｍｅｄｉａｔｅ  Ｌａｎｇｕａｇｅ）と呼ばれる中間言語（Ｊａｖａ（登録商標）におけるバイトコードに相当）をＣＬＩ（Ｃｏｍｍｏｎ  Ｌａｇｕａｇｅ  Ｉｎｆｒａｓｔｒｕｃｔｕｒｅ）と呼ばれる仮想マシン（Ｊａｖａ（登録商標）におけるＪａｖａ（登録商標）仮想マシンに相当）が実行する方式をとる。Ｃ＃言語におけるメタ情報はＥＣＭＡ−３５５規格のＰａｒｔｉｔｉｏｎ  ＩＩで定義されている。【００９０】  なお、実施の形態１、実施の形態２では、クラスファイルに含まれるすべてのメタ情報を、第２ＲＡＭ１３５のみへ記憶させたが、一部のメタ情報を第１ＲＡＭ１２５へ記憶させてもよい。この場合、第１ＲＡＭ１２５へ記憶させた情報については、デバッガなどのツールにより解析される恐れがあるが、通常の実行部１２０と安全な実行部１３０とのインタラクションを削減できるため、より速くアプリケーションを実行できるようになる。【００９１】  一部のメタ情報だけでは完全なクラスを復元することはできないが、入手したメタ情報から他のメタ情報を推定することで完全なクラスを復元することができる可能性がある。どれだけのメタ情報を隠蔽すれば十分であるかは、実行プログラムに求められる保護要件に基づき決定すればよい。
【産業上の利用可能性】
【００９２】  本発明に係るアプリケーション実行装置は、アプリケーションの実行、解析に不可欠なメタ情報を、盗聴、改ざんが困難な安全実行部へと隠蔽することで、アプリケーションを実行時の盗聴、改ざんから保護することができ、アプリケーションのダウンロード配信ビジネスにおいて、コンテンツ作成者の権利を保護することができる。
【図１】
2006009081.tif 000002
【図２】
2006009081.tif 000003
【図３】
2006009081.tif 000004
【図４】
2006009081.tif 000005
【図５】
2006009081.tif 000006
【図６】
2006009081.tif 000007
【図７】
2006009081.tif 000008
【図８】
2006009081.tif 000009
【図９】
2006009081.tif 000010
【図１０】
2006009081.tif 000011
【図１１】
2006009081.tif 000012
【図１２】
2006009081.tif 000013
【図１３】
2006009081.tif 000014
【図１４】
2006009081.tif 000015
【図１５】
2006009081.tif 000016
【図１６】
2006009081.tif 000017
【図１７】
2006009081.tif 000018
【図１８】
2006009081.tif 000019
【図１９】
2006009081.tif 000020
【図２０】
2006009081.tif 000021
【図２１】
2006009081.tif 000022
【図２２】
2006009081.tif 000023
【図２３】
2006009081.tif 000024
【手続補正書】
【提出日】平成18年12月26日(2006.12.26)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
取得したアプリケーションをクラス単位で実行するアプリケーション実行装置であって、
クラスファイルに含まれるメタ情報を記憶するメタ情報記憶手段と、
クラスファイルに含まれる命令列を記憶する命令列記憶手段と、
参照すべき情報のない命令を実行し、参照すべき第１情報があるとき要求し、通知された第２情報を用いて命令を実行する命令実行手段と、
前記命令実行手段の要求に応じて前記メタ情報から第２情報を生成し、前記命令実行手段に通知するメタ情報実行手段とを備え、
前記メタ情報記憶手段に記憶されたメタ情報は、前記メタ情報実行手段だけが読み出すことができ、前記メタ情報実行手段は、前記命令実行手段の要求だけを受け付けることを特徴とするアプリケーション実行装置。
【請求項２】
前記メタ情報記憶手段は、インデックスとコンスタントプールの型とその値とを記載したコンスタントプールと、項目とその値とを記載したクラス構造情報とを記憶し、
前記命令列記憶手段は、クラスで定義されているメソッドのバイトコードを記憶し、
前記メタ情報実行手段は、前記命令実行手段がバイトコードに第１情報であるコンスタントプールのインテックスが指定されている命令を実行するとき、その命令の種類に応じて前記コンスタントプールとクラス構造情報とを参照して第２情報を生成することを特徴とする請求項１記載のアプリケーション実行装置。
【請求項３】
前記命令実行手段が実行するバイトコードが新しいオブジェクトの生成であるとき、
前記メタ情報実行手段は、指定されたインデックスに対応するコンスタントプールの型を前記コンスタントプールから検索し、前記クラス構造情報を参照して、メモリサイズを生成することを特徴とする請求項２記載のアプリケーション実行装置。
【請求項４】
前記命令実行手段が実行するバイトコードがメソッドの呼び出しであるとき、
前記メタ情報実行手段は、指定されたインデックスに対応するコンスタントプールの型を前記コンスタントプールから検索し、前記クラス構造情報を参照して前記メソッドのアドレスを生成することを特徴とする請求項２記載のアプリケーション実行装置。
【請求項５】
前記命令実行手段が実行するバイトコードがオブジェクトのフィールド参照であるとき、
前記メタ情報実行手段は、指定されたインデックスに対応するコンスタントプールの型を前記コンスタントプールから検索し、前記クラス構造情報を参照して、前記フィールドのアドレスを生成することを特徴とする請求項２記載のアプリケーション実行装置。
【請求項６】
前記取得されたアプリケーションは暗号化されており、
前記暗号化されたアプリケーションを復号し、復号された命令列を前記命令列記憶手段に記憶させ、復号されたメタ情報を前記メタ情報記憶手段に記憶させる復号手段を更に備えることを特徴とする請求項１記載のアプリケーション実行装置。
【請求項７】
前記復号手段は、
外部から直接アクセスできない鍵記憶手段に記憶された復号鍵を用いて前記アプリケーションを復号することを特徴とする請求項６記載のアプリケーション実行装置。
【請求項８】
前記アプリケーションは、Ｊａｖａ（登録商標）アプリケーションであることを特徴とする請求項１記載のアプリケーション実行装置。
【請求項９】
取得したアプリケーションをクラス単位で実行するアプリケーション実行装置のアプリケーション実行方法であって、
クラスファイルに含まれるメタ情報を記録するメタ情報記録ステップと、
クラスファイルに含まれる命令列を記録する命令列記録ステップと、
参照すべき情報のない命令を実行し、参照すべき第１情報があるとき要求し、通知された第２情報を用いて命令を実行する命令実行ステップと、
前記命令実行ステップの要求に応じて前記メタ情報から第２情報を生成し、前記命令実行ステップに通知するメタ情報実行ステップとを有し、
前記メタ情報記録ステップに記録されたメタ情報は、前記メタ情報実行ステップだけが読み出すことができ、前記メタ情報実行ステップは、前記命令実行ステップの要求だけを受け付けることを特徴とするアプリケーション実行装置のアプリケーション実行方法。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、アプリケーションプログラム（特にＪａｖａ（登録商標）言語で記述されたプログラム）を実行するアプリケーション実行装置に関し、インターネットやＤＶＤ等の外部のメディアからダウンロードしたアプリケーションを実行する時に、アプリケーションが不正に盗聴、改竄されることを防止する技術に関する。
【背景技術】
【０００２】
従来のデジタルＴＶや携帯電話などの電子機器では、Ｊａｖａ（登録商標）言語で記述されたアプリケーションプログラムをダウンロードし、実行する機能を搭載するものが増加している。たとえば携帯電話では、ＮＴＴ  ＤｏＣｏＭｏがｉアプリ（登録商標）と呼ばれるサービスを提供している。このサービスは、携帯電話端末がインターネット上にあるアプリケーション配信サーバからＪａｖａ（登録商標）プログラムをダウンロードして、端末上で実行する。
【０００３】
また、欧州では、ＤＶＢ−ＭＨＰ（Ｄｉｇｉｔａｌ  Ｖｉｄｅｏ  Ｂｒｏａｄｃａｓｔｉｎｇ−Ｍｕｌｔｉｍｅｄｉａ  Ｈｏｍｅ  Ｐｌａｔｆｏｒｍ）と呼ばれる仕様が策定され、既に仕様に準拠した運用が開始されている。ＤＶＢ−ＭＨＰ規格に基づくデジタル放送では、放送波に多重化されたＪａｖａ（登録商標）プログラムをデジタルＴＶが受信し、それを実行する。
【０００４】
このようなアプリケーションプログラム配信サービスにおいて、配信されるアプリケーションプログラムはそのアプリケーションプログラムの開発者の知的財産権で保護されており、これを悪意のある攻撃者が盗聴することは防がなくてはならない。また、悪意のある攻撃者により改ざんされたアプリケーションプログラムが、利用者やアプリ製作者の意図しない動作をすることを防がなくてはならない。
【０００５】
近年の電子機器は、多数のソフトウエアモジュールから構成されている。専門的な知識を有する者であれば、これらのソフトウエアモジュールのバグを悪用することで電子機器内のソフトウエアを改ざんすることも可能である。また、デバッガやＩＣＥ（Ｉｎ−Ｃｉｒｃｕｉｔ  Ｅｍｕｌａｔｏｒ）等のツールを用いることでも同様のことは実現可能である。そのため、たとえばＪａｖａ（登録商標）プログラムに著作権管理機能や課金機能が含まれる場合には、これらの機能を無効化できてしまうという問題が発生する。今後、インターネット等を利用したＪａｖａ（登録商標）アプリケーションプログラムの配信ビジネスが本格化するに従い、このようなアプリケーションプログラムの盗聴、改ざんの問題が深刻化すると予想される。
【０００６】
従来、ソフトウエアモジュールのバグの悪用や、デバッガ、ＩＣＥなどのツールによってメモリ上のプログラムを解析、改ざんすることを防ぐために、元のプログラムに対し、複雑化と暗号化という方法が用いられている。
複雑化とは、処理の分割、出現順序の交換、条件の挿入などの処理を施すことにより、元のプログラムと動作は同じであるが、より複雑なプログラムへと変換し、プログラム自体を複雑にするという手法であり、暗号化とは、プログラムを暗号化しておき、実行時にだけ復号する方法である。
【特許文献１】特表２００２−５１４３３３
【発明の開示】
【発明が解決しようとする課題】
【０００７】
しかし、複雑化の方法は、どれだけ複雑な変換を施したとしても、時間をかけて解析することでいつかは解析されてしまう。プログラムの金銭的価値が高くなれば、いかに複雑なプログラムであってもそれを解析するためのコストを負担する者が現れるのは必然である。
また、暗号化の方法は、プログラムの実行中は復号されているので、その間に解析、盗聴されてしまう可能性がある。
【０００８】
本発明は、上記の問題を解決するもので、ソフトウエアモジュールのバグの悪用や、専門的なツールによるアプリケーションプログラムの盗聴、改ざんを防止するアプリケーション実行装置を提供することを目的とする。
【課題を解決するための手段】
【０００９】
上記課題を解決するため、本発明は、取得したアプリケーションをクラス単位で実行するアプリケーション実行装置であって、クラスファイルに含まれるメタ情報を記憶するメタ情報記憶手段と、クラスファイルに含まれる命令列を記憶する命令列記憶手段と、参照すべき情報のない命令を実行し、参照すべき第１情報があるとき要求し、通知された第２情報を用いて命令を実行する命令実行手段と、前記命令実行手段の要求に応じて前記メタ情報から第２情報を生成し、前記命令実行手段に通知するメタ情報実行手段とを備え、前記メタ情報記憶手段に記憶されたメタ情報は、前記メタ情報実行手段だけが読み出すことができ、前記メタ情報実行手段は、前記命令実行手段の要求だけを受け付けることとしている。
【発明の効果】
【００１０】
上記構成により、アプリケーションの命令を実行する命令実行手段は、参照すべき情報があるとき、メタ情報実行手段に指示して、必要とする第２情報が通知されるので、例えばデバッガを用いて命令実行手段を盗聴したとしても、メタ情報記憶手段に記憶されているメタ情報そのものは見ることが出来ない。したがって、命令実行手段で命令列が盗聴、改ざんされたとしても、アプリケーションの解析は困難であり、盗聴、改ざんを防止することができる。
【００１１】
また、前記メタ情報記憶手段は、インデックスとコンスタントプールの型とその値とを記載したコンスタントプールと、項目とその値とを記載したクラス構造情報とを記憶し、前記命令列記憶手段は、クラスで定義されているメソッドのバイトコードを記憶し、前記メタ情報実行手段は、前記命令実行手段がバイトコードに第１情報であるコンスタントプールのインテックスが指定されている命令を実行するとき、その命令の種類に応じて前記コンスタントプールとクラス構造情報とを参照して第２情報を生成することとしている。
【００１２】
これにより、アプリケーションの実行時においても、アプリケーションが不正に解析、改ざんされることを防ぐことができ、保護強度が向上する。
また、前記命令実行手段が実行するバイトコードが新しいオブジェクトの生成であるとき、前記メタ情報実行手段は、指定されたインデックスに対応するコンスタントプールの型を前記コンスタントプールから検索し、前記クラス構造情報を参照して、メモリサイズを生成することとしている。
【００１３】
これにより、命令実行手段はオブジェクトのサイズを得るが、オブジェクトのサイズの計算の元になった、当該クラスが宣言するメタ情報のフィールドの数と型記述子は命令実行手段には見えない。
また、前記命令実行手段が実行するバイトコードがメソッドの呼び出しであるとき、前記メタ情報実行手段は、指定されたインデックスに対応するコンスタントプールの型を前記コンスタントプールから検索し、前記クラス構造情報を参照して前記メソッドのアドレスを生成することとしている。
【００１４】
これにより、命令実行手段はメソッドのアドレスを得るが、当該アドレスを得るのに必要なメタ情報は命令実行手段には見えない。
また、前記命令実行手段が実行するバイトコードがオブジェクトのフィールド参照であるとき、前記メタ情報実行手段は、指定されたインデックスに対応するコンスタントプールの型を前記コンスタントプールから検索し、前記クラス構造情報を参照して、前記フィールドのアドレスを生成することとしている。
【００１５】
これにより、命令実行手段はフィールドのアドレスを得るが、当該アドレスを得るのに必要なメタ情報は命令実行手段には見えない。
また、前記取得されたアプリケーションは暗号化されており、前記暗号化されたアプリケーションを復号し、復号された命令列を前記命令列記憶手段に記憶させ、復号されたメタ情報を前記メタ情報記憶手段に記憶させる復号手段を更に備えることとしている。
【００１６】
これにより、アプリケーションの復号時においてもアプリケーションのメタ情報を保護することができ、より保護強度が向上する。
また、前記復号手段は、外部から直接アクセスできない鍵記憶手段に記憶された復号鍵を用いて前記アプリケーションを復号することとしている。
これにより、アプリケーションが不正に復号され、解析、改ざんされることを防ぐことができ、保護強度が向上する。
【００１７】
また、前記アプリケーションは、Ｊａｖａ（登録商標）アプリケーションであることとしている。
これにより、Ｊａｖａ（登録商標）アプリケーションが不正に盗聴、改ざんされることを防ぐことができる。
また、本発明は、取得したアプリケーションをクラス単位で実行するアプリケーション実行装置のアプリケーション実行方法であって、クラスファイルに含まれるメタ情報を記録するメタ情報記録ステップと、クラスファイルに含まれる命令列を記録する命令列記録ステップと、参照すべき情報のない命令を実行し、参照すべき第１情報があるとき要求し、通知された第２情報を用いて命令を実行する命令実行ステップと、前記命令実行ステップの要求に応じて前記メタ情報から第２情報を生成し、前記命令実行ステップに通知するメタ情報実行ステップとを有し、前記メタ情報記録ステップに記録されたメタ情報は、前記メタ情報実行ステップだけが読み出すことができ、前記メタ情報実行ステップは、前記命令実行ステップの要求だけを受け付けることとしている。
【００１８】
上記方法により、デバッガ等のツールによりアプリケーション実行時に、アプリケーションの命令がメモリ上で盗聴、改ざんされたとしても、デバッガ等からはアプリケーションのメタ情報にはアクセスできないので、アプリケーションとしての解析を困難にし、盗聴、改ざんを防止することができる。
【発明を実施するための最良の形態】
【００１９】
本発明に係るアプリケーション実行装置の実施の形態を、図面を参照しながら説明する。
（実施の形態１）
図１は、本発明に係るアプリケーション実行装置の実施の形態１の構成図である。
ダウンロード可能なアプリケーションプログラム（以下、単に「アプリケーション」という）１００は、アプリケーション実行装置１１０からダウンロード可能なアプリケーションであり、本実施の形態においては、コンパイルされ、暗号化されたＪａｖａ（登録商標）アプリケーションである。
【００２０】
アプリケーション実行装置１１０は、通常実行部１２０と安全な実行部１３０とを備え、仮想線１４０の上方のソフトウェアと下方のハードウェアとで構成される。アプリケーション実行装置１１０は、たとえばデジタルテレビ、セットトップボックス、ＤＶＤレコーダー、Ｂｌｕ−ｒａｙ  Ｄｉｓｃ（ＢＤ）レコーダー、カーナビ端末、携帯電話、ＰＤＡなどの、Ｊａｖａ（登録商標）仮想マシンを搭載する電子機器あるいは端末に摘用される。
【００２１】
通常実行部１２０は、ソフトウェアとして、アプリ取得プログラム１２１、Ｊａｖａ（登録商標）仮想マシン１２２、ＯＳ１２３と、ハードウェアとして、第１ＣＰＵ１２４、第１ＲＡＭ１２５、第１ＲＯＭ１２６とから構成される。ここで、アプリ取得プログラム１２１、Ｊａｖａ（登録商標）仮想マシン１２２、ＯＳ１２３の並び順は、ソフトウェアの階層構成の上層からの順を示し、これらのソフトウェアは第1ＣＰＵ１２４で動作する。
【００２２】
通常実行部１２０は、たとえば通常のパーソナルコンピュータやデジタル家電機器等に搭載されているプログラム実行手段と同様のものである。なお、請求の範囲では、通常実行部１２０は、命令実行手段及び命令列記憶手段で構成される。
安全な実行部１３０は、ソフトウェアとして、メタ情報管理部１３１、Ｊａｖａ（登録商標）仮想マシンローダ１３２、復号処理部１３３と、ハードウェアとして、第２ＣＰＵ１３４、第２ＲＡＭ１３５、第２ＲＯＭ１３６とから構成される。ここで、メタ情報管理部１３１、Ｊａｖａ（登録商標）仮想マシンローダ１３２、復号処理部１３３の各ソフトウェアは、第２ＣＰＵ１２４で動作する。
【００２３】
安全な実行部１３０は、悪意のある第三者からの攻撃を防御しつつ、安全にプログラムを実行させることができる。即ち、安全な実行部１３０は、外部の装置から直接アクセスされることが禁止され、第１ＣＰＵ１２４からの指示に応じて、第２ＣＰＵ１３４は必要な情報を第１ＣＰＵ１２４に通知する。なお、請求の範囲では、安全な実行部１３０は、メタ情報実行手段及びメタ情報記憶手段並びに復号手段で構成される。
【００２４】
先ず、通常実行部１２０の各構成要素について説明する。
アプリ取得プログラム１２１は、アプリケーション１００をアプリケーション実行装置１１０の外部から取得し、第１ＲＡＭ１２５に記憶させる。アプリ取得プログラム１２１は、たとえば、インターネット上にあるサーバから、ＴＬＳ（Ｔｒａｎｓｐｏｒｔ  Ｌａｙｅｒ  Ｓｅｃｕｒｉｔｙ）、ＨＴＴＰ（Ｈｙｐｅｒ  Ｔｅｘｔ  Ｔｒａｎｓｆｅｒ  Ｐｒｏｔｏｃｏｌ）等のプロトコルに従いＪａｖａ（登録商標）アプリケーション１００（暗号化され、クラスファイル形式）をダウンロードするＪａｖａ（登録商標）プログラムが相当する。
【００２５】
ここで、ＴＬＳは暗号化により通信時のデータの盗聴、改ざんを防ぐデータ転送方式である。ＴＬＳの詳細はＲＦＣ２２４６に記載されており、ここでは詳細な説明を省略する。
また、ＨＴＴＰは、インターネット上のデータ通信で一般的に用いられているデータ転送方式である。ＨＴＴＰの詳細はＲＦＣ２６１６に記載されており、ここでは詳細な説明を省略する。
【００２６】
なお、アプリ取得プログラム１２１は、デジタル放送のデータ放送として、ＭＰＥＧ２トランスポートストリーム内に埋め込まれたＪａｖａ（登録商標）アプリケーションをアプリケーション実行装置１１０に読み出すＪａｖａ（登録商標）プログラムであってもよい。ＭＰＥＧ２トランスポートストリームの詳細はＭＰＥＧ規格書  ＩＳＯ／ＩＥＣ１３８１８１−１に記載されているので、その説明を省略する。ＭＰＥＧ２トランスポートストリームにＪａｖａ（登録商標）プログラムを埋め込む方法は、ＤＳＭＣＣ方式として、ＭＰＥＧ規格書  ＩＳＯ／ＩＥＣ１３８１８１−６に記述されている。ここではＤＳＭＣＣの詳細な説明は省略する。ＤＳＭＣＣ方式は、ＭＰＥＧ２トランスポートストリームのパケットの中に、コンピュータで使用されているディレクトリやファイルで構成されるファイルシステムをエンコードする方法を規定している。
【００２７】
また、アプリ取得プログラム１２１は、ＳＤカード、ＣＤ−ＲＯＭ、ＤＶＤ、ＢＤ−ＲＯＭ等のリムーバブルメディアに記録されたＪａｖａ（登録商標）アプリケーションを、第１ＲＡＭ１２５に書き込むＪａｖａ（登録商標）プログラムであってもよい。アプリ取得プログラム１２１はＯＳ１２３が提供するファイル操作機能を用いて、これらのリムーバブルメディアに記録されたＪａｖａ（登録商標）アプリケーションを読み出す。
【００２８】
また、アプリ取得プログラム１２１は、アプリケーション実行装置１１０内にある第１ＲＯＭに記録されたＪａｖａ（登録商標）アプリケーションを、第１ＲＡＭ１２５に書き込むＪａｖａ（登録商標）プログラムであってもよい。アプリ取得プログラム１２１はＯＳ１２３が提供するファイル操作機能を用いて、第１ＲＯＭ１２６に記録されたＪａｖａ（登録商標）アプリケーションを読み出す。
【００２９】
なお、本実施の形態ではアプリ取得プログラム１２１は、Ｊａｖａ（登録商標）言語で記述されたＪａｖａ（登録商標）プログラムとしているが、同等の機能を有する、ネイティブ（実行装置固有）言語で記述されたプログラムで実現されていてもよい。
Ｊａｖａ（登録商標）仮想マシン１２２は、Ｊａｖａ（登録商標）言語で記述されたプログラムを逐次解析し実行するＪａｖａ（登録商標）バーチャル（仮想）マシンである。Ｊａｖａ（登録商標）言語で記述されたプログラムはバイトコードと呼ばれる、ハードウエアに依存しない中間コードの命令列（オペレーション）にコンパイルされる。Ｊａｖａ（登録商標）仮想マシン１２２は、このバイトコードを解釈、実行するソフトウエアで実現される。また、一部のＪａｖａ（登録商標）仮想マシン１２２は、バイトコードを第１ＣＰＵ１２４が実行可能な実行形式に翻訳するＪＩＴ（JustIn Time）コンパイラと呼ばれる機能を持つものもある。また、一部のＪａｖａ（登録商標）仮想マシン１２２は、一部のバイトコードを直接実行可能なプロセッサと、プロセッサでは直接実行できないバイトコードを実行するインタプリタから構成されることもある。なお、Ｊａｖａ（登録商標）言語の詳細は、書籍「Ｊａｖａ（登録商標）  Ｌａｎｇｕａｇｅ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ（ＩＳＢＮ  ０−２０１−６３４５１−１）」等の多くの書籍で解説されているので、ここでは、その詳細を省略する。
【００３０】
Ｊａｖａ（登録商標）仮想マシン１２２は、複数のサブプログラムから構成される。 
図２は、Ｊａｖａ（登録商標）仮想マシン１２２を構成するサブプログラムの一例である。 
Ｊａｖａ（登録商標）仮想マシン１２２は、図２に示すように、バイトコードインタプリタ２０１、クラスローダ２０２、ベリファイヤ２０３、Ｊａｖａ（登録商標）ヒープ管理部２０４、Ｊａｖａ（登録商標）ネイティブライブラリ２０５、ＪＩＴコンパイラ２０６で構成されている。
【００３１】
バイトコードインタプリタ２０１は、クラスファイルに含まれるバイトコードを解釈、実行するサブプログラムで、Ｊａｖａ（登録商標）仮想マシン１２２において中核的な処理を行うサブプログラムである。詳細ついては後述する。
クラスローダ２０２は、アプリ取得プログラム１２１が取得したＪａｖａ（登録商標）アプリケーション１００を、第１ＲＡＭ１２５から読み出し、Ｊａｖａ（登録商標）仮想マシン１２２が実行できるアプリケーションに変換して再度第１ＲＡＭ１２５に書き込み、クラスを実行可能な状態にする。また、クラスローダ２０２は、クラスアンロード処理も行う。クラスアンロード処理とは、実行が終了し不要になったクラスをＪａｖａ（登録商標）仮想マシン１２２から取り除く処理のことである。
【００３２】
ここで、クラスとは、Ｊａｖａ（登録商標）アプリケーションを構成する基本単位であり、書籍「Ｊａｖａ（登録商標）  Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ（ＩＳＢＮ  ０−２０１−６３４５１―）」で定義されている。
図３は、クラスに含まれる情報の概要を示した図である。
「Ｊａｖａ（登録商標）  Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ」での規定では、クラスは 図３に示されていない情報もあるが、ここでは説明の簡単化のため本発明に関連のある項目のみ説明する。
【００３３】
クラス構造情報３０１は、このクラスが保持するフィールド、メソッド、どのクラスを継承するかなど、クラスの構造に関する情報を含んでいる。
コンスタントプール３０２は、アプリケーション（クラス）で定義されている定数（コンスタント）に関するデータをまとめた情報であり、クラスで定義しているまたはこのクラスから参照している他クラスのフィールド、メソッド、クラスの名前などの情報を含んでいる。クラス構造情報３０１とコンスタントプール３０２とを総称してクラスのメタ情報（または、単にメタ情報）と呼ぶ。
【００３４】
バイトコード３０３は、そのクラスにおいて実行されるメソッドの処理を、中間言語の命令の列として記述したものである。バイトコード３０３にはアプリケーションが処理するデータに関する情報は含まれない。したがって、Ｊａｖａ（登録商標）アプリケーションの実行においては、バイトコード３０３だけでは一般的に実行処理ができず、データ部分を定義したコンスタントプール３０２があって始めて実行処理が可能となる。クラスに含まれる上記の各情報の例については、後述する。
【００３５】
図２に戻って、ベリファイヤ２０３は、クラスのデータ形式の不備や、クラスに含まれるバイトコードの安全性を判定する。バイトコードの安全性の検査方法は、Ｊａｖａ（登録商標）  Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ  Ｓｐｅｃｉｆｉｃａｔｉｏｎで定義されているため詳細な説明は省略する。
ベリファイヤ２０３が妥当ではないと判定されたクラスは、クラスローダ２０２はロードをしない。
【００３６】
Ｊａｖａ（登録商標）ヒープ管理部２０４は、Ｊａｖａ（登録商標）ヒープと呼ばれる、Ｊａｖａ（登録商標）アプリケーションが使用するワーキングメモリの確保を行う。Ｊａｖａ（登録商標）ヒープは第１ＲＡＭ１２５内に確保される。また、Ｊａｖａ（登録商標）ヒープ管理部２０４は、ガーベジコレクションも行う。ここで、ガーベジコレクションとは、アプリケーション実行において不要になったワーキングメモリを開放し、他の用途に再利用できるようにする公知の技術をいい、詳細な説明は省略する。
【００３７】
Ｊａｖａ（登録商標）ネイティブライブラリ２０５は、Ｊａｖａ（登録商標）アプリケーションから呼び出されるライブラリで、ＯＳ１２３や、アプリケーション実行装置１１０が備える図１には記載されていないハードウエア、サブプログラム等で提供される機能を、Ｊａｖａ（登録商標）アプリケーションへ提供する。
ＪＩＴコンパイラ２０６は、バイトコード３０３を第１ＣＰＵ１２４もしくは第２ＣＰＵ１３４が理解可能な実行形式に翻訳する。
【００３８】
以上で、図２に基づく、Ｊａｖａ（登録商標）仮想マシン１２２の概略の説明を終わる。
再び図１に戻って、ＯＳ１２３は、アプリケーション実行装置１１０の電源が投入されると第１ＣＰＵ１２４が起動する基本ソフトウェアである。ＯＳ１２３は、オペレーティングシステムの略であり、Ｌｉｎｕｘが一例である。ＯＳ１２３は、プログラムを平行して実行するカーネル及び、ライブラリで構成される公知の技術の総称であり、詳細な説明は省略する。ＯＳ１２３はＪａｖａ（登録商標）仮想マシン１２２をサブプログラムとして実行する。
【００３９】
第１ＣＰＵ１２４は、Ｊａｖａ（登録商標）仮想マシン１２２、ＯＳ１２３、アプリケーション取得プログラム１２１、アプリケーション取得プログラム１２１の実行で取得されたアプリケーション１００の各プログラムに従い処理を実行する。
第１ＲＡＭ１２５は、アプリケーション取得プログラム１２１の実行で取得されたアプリケーションプログラムをクラスファイルとして記憶し、復号されたＪａｖａ（登録商標）仮想マシン１２２を記憶する。また、第１ＣＰＵ１２４が処理を行う際、一時的にデータを保存する。また、第１ＣＰＵ１２４から第２ＣＰＵ１３４に実行を依頼するときの、両ＣＰＵ間のデータの受け渡しに使用される。第１ＲＡＭ１２５は、たとえば、ＳＲＡＭ、ＤＲＡＭ等の一次記憶からなる。
【００４０】
第１ＲＯＭ１２６は、暗号化されたＪａｖａ（登録商標）仮想マシン４０１などを記憶する。第１ＣＰＵ１２４から指示されたデータやプログラムを記憶する。第１ＲＯＭ１２６は、具体的にはフラッシュメモリやハードディスク等の不揮発性メモリからなる。
図４は、第１ＲＯＭ１２６が記憶している内容の一例を示す図である。
第１ＲＯＭ１２６は、暗号化されたＪａｖａ（登録商標）仮想マシン４０１、暗号化されたアプリ取得プログラム４０２、暗号化されたメタ情報管理部４０３、起動クラス名４０４を含む。
【００４１】
図５は、アプリ取得プログラム４０２の構成を示す図である。
アプリ取得プログラム４０２は、サブクラス５０１〜５０３などの複数のクラスから構成される。各サブクラスは暗号化されている。 
起動クラス名４０４は、Ｊａｖａ（登録商標）仮想マシン１２２が起動した際に最初に実行するプログラムであるクラスの名前である。本実施の形態では暗号化起動クラス名４０４にはサブクラス５０１が指定されているものとする。なお、第１ＲＯＭ１２６は図４に示した以外のデータを記憶していてもよい。
【００４２】
次に、安全な実行部１３０の各構成要素について説明する。
メタ情報管理部１３１は、Ｊａｖａ（登録商標）仮想マシン１２２にロードされているクラスに含まれるメタ情報を管理し、バイトコードインタプリタ２０１の要求によりその情報を参照処理し、その結果を提供するプログラムである。メタ情報管理部１３１については後に詳細に説明をする。
【００４３】
Ｊａｖａ（登録商標）仮想マシンローダ１３２は、アプリケーション実行装置１１０の電源投入後に、第１ＣＰＵ１２４がＪａｖａ（登録商標）仮想マシン１２２を実行可能な状態にするための処理を行う。Ｊａｖａ（登録商標）仮想マシンローダ１３２については後に詳細に説明をする。
復号処理部１３３は、第１ＲＡＭ１２５もしくは第１ＲＯＭ１２６が記憶する暗号化された情報（アプリケーション、Ｊａｖａ（登録商標）仮想マシン１２２等）を復号し、第１ＲＡＭ１２５へ復号結果を書き出すプログラムである。暗号化のためのアルゴリズムは任意の暗号アルゴリズムを用いることが可能である。
【００４４】
上記の復号のための鍵は、第２ＲＯＭ１３６に記憶されている復号鍵７０１を使用する。
第２ＣＰＵ１３４は、メタ情報管理部１３１、Ｊａｖａ（登録商標）仮想マシンローダ１３２、復号処理部１３３の各プログラムに従い処理を実行する。
第２ＲＡＭ１３５は、後述のクラス構造情報３０１、コンスタントプール３０２およびクラスＩＤ対応テーブルを記憶する。また、第２ＣＰＵ１３４が処理を行う際、一時的にデータを保存するために使用される。
【００４５】
第２ＲＡＭ１３５は、たとえば、ＤＲＡＭやＳＲＡＭ等で構成され第２ＣＰＵ１３４からのみアクセスが可能であり、第１ＣＰＵ１２４から第２ＲＡＭ１３５に記憶された情報を読むことも書くこともできない。なお、第２ＲＡＭ１３５はＣＰＵ１３４に混載されていてもよい。
通常実行部１２０で動作するプログラム、たとえばＪａｖａ（登録商標）仮想マシン１２２と安全な実行部１３０で動作するプログラム、たとえばメタ情報管理部１３１は、共同して動作するため、両者の間で情報の交換が必要となる。
【００４６】
図６は、Ｊａｖａ（登録商標）仮想マシン１２２が、たとえばメタ情報管理部１３１に処理を指示するときのフローチャートである。
図６において、Ｊａｖａ（登録商標）仮想マシン１２２は、メタ情報管理部１３１に渡す情報を、第１ＲＡＭ１２５の所定のアドレスへ記憶させる（Ｓ６０１）。次に、Ｊａｖａ（登録商標）仮想マシン１２２は、第１ＣＰＵ１２４を通じて第２ＣＰＵ１３４へ、メタ情報管理部１３１の実行を指示する（Ｓ６０２）。メタ情報管理部１３１は、第１ＲＡＭ１２５の所定のアドレスから、Ｊａｖａ（登録商標）仮想マシン１２２がＳ６０１で記憶されたデータを読み出し（Ｓ６０３）、そのデータを用いて所定の処理を行う（Ｓ６０４）。
【００４７】
次に、メタ情報管理部１３１は、Ｓ６０４で得られた処理結果を第１ＲＡＭ１２５の所定のアドレスへ書きこむ（Ｓ６０５）。次に、メタ情報管理部１３１は、第２ＣＰＵ１３４を通じて第１ＣＰＵ１２４へＪａｖａ（登録商標）仮想マシン１２２の実行を指示する（Ｓ６０６）。次に、Ｊａｖａ（登録商標）仮想マシン１２２は第１ＲＡＭ１２５の所定のアドレスから、メタ情報管理部１３１がＳ６０４で行なった処理の結果を読みだす。
【００４８】
以上のように実行することで、第１ＣＰＵ１２４からは直接参照することができない情報に基づく処理を、安全な実行部１３０内で動作するプログラムに指示して情報を受け渡しできる。
第２ＲＯＭ１３６は、読み出し専用の不揮発性メモリからなり、第２ＣＰＵ１３４以外からは第２ＲＯＭ１３６が記憶する情報を読みだすことが出来ないことを保証する。
【００４９】
図７は、第２ＲＯＭ１３６が記憶する情報の一例を示す図である。
図７の第２ＲＯＭ１３６には、第１ＲＯＭ１２６が記憶するＪａｖａ（登録商標）仮想マシン４０１，アプリ取得プログラム４０２に含まれるサブクラス５０１〜５０３を復号するための復号鍵７０１を記憶している。本実施の形態では、Ｊａｖａ（登録商標）仮想マシン４０１、アプリ取得プログラム４０２、起動クラス名４０４を復号する鍵は、復号鍵７０１一つのみとしているが、それぞれに別々の鍵を用いても本発明は実施可能である。なお、第２ＲＯＭ１３６は図７に示されていない別のデータを記憶していてもよい。
【００５０】
また、復号鍵７０１は、アプリ取得プログラム１２１で取得された暗号化されたアプリケーション１００の復号のための暗号化された復号鍵を復号するために用いられる。アプリケーション１００の復号された復号鍵も第２ＲＯＭ１３６に記憶される。
なお、本実施の形態では、アプリケーション実行装置１１０は二つのＣＰＵを備えているが、一つのＣＰＵが動作モードを切り替えるなどの方法で仮想的に二つのＣＰＵのように振舞ってもよい。動作モードを変えることが可能なＣＰＵには、たとえばＩｎｔｅｌ社のＬａＧｒａｎｄｅがある。このＣＰＵは通常モードとセキュアモードと呼ばれる２つの動作モードを持つ。通常モード側で動作するプログラムからは、セキュアモード上で動くプログラムを盗聴、改ざんすることができないように構成されている。同様の機能を持ったＣＰＵはＡＲＭ社やＡＭＤ社からも発表されている。
【００５１】
なお、本実施の形態では、メタ情報管理部１３１、Ｊａｖａ（登録商標）仮想マシンローダ１３２、復号処理部１３３は第２ＣＰＵ１３４で実行されるプログラムとしているが、ＬＳＩでこれらの機能を実現してもよい。
また、第１ＲＡＭ１２５、第２ＲＡＭ１３５は、一つのＲＡＭを仮想的に２つのＲＡＭとして扱ったものとしてもよく、また、第１ＲＯＭ１２６、第２ＲＯＭ１３６は一つのＲＯＭを仮想的に２つのＲＯＭとして扱ったものとしてもよい。
【００５２】
また、安全な実行部１３０全体、もしくは一部をハードウエアにより実現してもよい。この場合、第１ＣＰＵ１２４と第２ＣＰＵ１３４間のデータ通信は暗号化して行い、第三者による盗聴を防ぐ。これは両ＣＰＵを結ぶデータバス（図示されていない）にデータを送信する際に暗号化し、データを受信後に復号することで行われる。
また、安全な実行部１３０は、スマートカードやＩＣカードのように、アプリケーション実行装置１１０から取り外し可能な装置であってもよい。スマートカード、ＩＣカードはカード内部にＣＰＵやメモリ、セキュリティ回路を含む公知の技術であり、詳細な説明を省略する。この場合、通常実行部１２０と安全な実行部１３０間のデータ転送は、ＳＡＣ（Ｓｅｃｕｒｅ  Ａｕｔｈｅｎｔｉｃａｔｅｄ  Ｃｈａｎｎｅｌ）等の技術を用いて、第三者による盗聴を防ぎながら行うようにする。ＳＡＣはＩＣカードと外部機器の相互認証、および暗号鍵の共有を安全に行うための公知の技術である。
【００５３】
また、安全な実行部１３０のソフトウェアは、耐タンパソフトウエア技術により保護されたソフトウエアであってもよい。
次に、アプリケーション実行装置１１０がＪａｖａ（登録商標）アプリケーションを盗聴、改ざんから保護しながら実行する方法について説明する。
Ｊａｖａ（登録商標）アプリケーション実行装置１１０の電源が投入されると、第１ＣＰＵ１２４は、ＯＳ１２３を起動する。ＯＳ１２３は起動後、第1ＣＰＵ１２４を通じて第２ＣＰＵ１３４に対し、Ｊａｖａ（登録商標）仮想マシンローダ１３２をロードするよう指示する。第２ＣＰＵ１３４によって起動されたＪａｖａ（登録商標）仮想マシンローダ１３２は、一定の手順でＪａｖａ（登録商標）仮想マシン１２２を第１ＲＡＭ１２５へ、メタ情報管理部１３１を第２ＲＡＭ１３５へロードする。
【００５４】
図８は、Ｊａｖａ（登録商標）仮想マシン１２２およびメタ情報管理部１３１をロードする手順を示した図である。
図８において、Ｓ８０１で、Ｊａｖａ（登録商標）仮想マシンローダ１３２は復号処理部１３３を使い、第１ＲＯＭ１２６に記憶されたＪａｖａ（登録商標）仮想マシン４０１を第１ＲＡＭ１２５へ復号する。
【００５５】
図９は、復号処理部１３３が、暗号化されたＪａｖａ（登録商標）仮想マシン４０１を復号する際の処理手順を示す図である。
図９において、復号処理部１３３は、第１ＲＯＭ１２６が記憶する暗号化されたＪａｖａ（登録商標）仮想マシン４０１を、第２ＣＰＵ１３３を通じて読み出す（Ｓ９０１）。
復号処理部１３３は、第２ＲＯＭ１３６から復号鍵７０１を取得し（Ｓ９０２）、Ｊａｖａ（登録商標）仮想マシン４０１の復号結果の出力先を判定する。（Ｓ９０３）出力先が第1ＲＡＭのとき、復号されたＪａｖａ（登録商標）仮想マシン１２２を、第２ＣＰＵ１３４を通じて第１ＲＡＭ１２５に（Ｓ９０４）、また、出力先が第２ＲＡＭのとき、第２ＲＡＭ１３５に記憶させる（Ｓ９０５）。
【００５６】
図８に戻って、Ｊａｖａ（登録商標）仮想マシンローダ１３２は、復号処理部１３３に指示して、第１ＲＯＭ１２６に記憶されたメタ情報管理部４０４を、第２ＲＡＭ１３５へ復号する（Ｓ８０２）。Ｊａｖａ（登録商標）仮想マシンローダ１３２は、ＯＳ１２３へロードの完了を通知する。（Ｓ８０３）
ＯＳ１２３は、Ｊａｖａ（登録商標）仮想マシンローダ１３２からロード完了通知を受け、Ｊａｖａ（登録商標）仮想マシン１２２の実行を開始する。Ｊａｖａ（登録商標）仮想マシン１２２の実行が開始されると、クラスローダ２０２が呼び出され、クラスローダ２０２は、図４で示す第1ＲＯＭ１２６に記憶されている起動クラス名４０４を参照し、起動クラス名４０４で指定されたクラスをロードする。
【００５７】
図１０は、起動クラス名４０４として、図５のアプリ取得プログラム４０２のサブクラス５０１が指定されていたときを例に、クラスローダ２０２がサブクラス５０１をロードする処理手順を示したフローチャートである。
まず、クラスローダ２０２は、復号処理部１３３に指示し、第1ＲＯＭ１２６に記憶されている暗号化されたサブクラス５０１の復号処理を行わせる（Ｓ１００１）。次に、ベリファイヤ２０３に指示し、第１ＲＡＭ１２５の復号されたサブクラスをベリファイさせる（Ｓ１００２）。クラスローダ２０２は、第１ＲＡＭ１２５の復号されたサブクラスからメタ情報（クラス構造情報３０１、コンスタントプール３０２）を抽出し（Ｓ１００３）、抽出後はサブクラスからメタ情報を削除して、当該メタ情報を第１ＲＡＭ１２５に書き出し、メタ情報管理部１３１を呼び出す（Ｓ１００４）。メタ情報管理部１３１は、第１ＲＡＭ１２５からメタ情報を読み取り、第２ＲＡＭ１３５へコピーする。クラスローダ２０２は、メタ情報管理部１３１によるメタ情報のコピーが終わると、第１ＲＡＭ１２５から当該メタ情報を削除する（Ｓ１００５）。
【００５８】
以上のようにして、クラスローダ２０２は、アプリ取得プログラムだけではなく、アプリ取得プログラム１２１で取得されたアプリケーションのクラスについても同様な処理を行い、クラスのメタ情報を、安全な第２ＲＡＭ１３５へのみ記憶させる。
上記のように構成することにより、アプリケーションの実行時に、クラスのメタ情報はデバッガ等では読み出すことも書き込むこともできない領域へ記憶することができる。
【００５９】
次に、バイトコードインタプリタ２０１、メタ情報管理部１３１が、クラスを盗聴、改ざんから保護しながら実行する処理の例について説明する。なお、クラスの構造やバイトコードインタプリタ２０１の動作は「Ｊａｖａ（登録商標）  Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ」で詳細に説明されているため、本実施の形態に関連の深い箇所のみを簡単に説明する。
【００６０】
図１１はＪａｖａ（登録商標）言語により記述されたクラスファイルの一例を示す図である。
クラス名１１０１は、このクラスの名前であり、例ではクラスの名前はＳａｍｐｌｅである。フィールド１１０２はＳａｍｐｌｅクラスが定義するフィールドである。フィールド１１０２は、メソッド実行時の計算結果の値を記憶させる領域として使うことができる。メソッド１１０３およびメソッド１１０４は、Ｓａｍｐｌｅクラスで定義されている２つのメソッドである。ここで、メソッドとは、クラスの処理内容を定義したものである。
【００６１】
Ｊａｖａ（登録商標）言語でクラスを定義したソ-スファイル１１００は、Ｊａｖａ（登録商標）コンパイラによりクラスファイル３００に変換される。変換されたクラスファイル３００は、クラス構造情報３０１、コンスタントプール３０２、バイトコード３０３から構成される。
図１２は、クラス１１００がコンパイルされたときのクラスファイル３００のコンスタントプール３０２を示す図である。
【００６２】
列１２０１は、コンスタントプール３０２のエントリ番号を示すインデックスであり、コンスタントプール３０２の参照はインデックスで表現する。列１２０２はコンスタントプールの型である。コンスタントプールは、記録する情報の種類に応じて型が決められている。列１２０３はコンスタントプールの値である。
たとえば、インデックス１は、インデックス３のクラスで宣言されているクラスにおいて、インデックス１３の示すメソッドへの参照であることを意味する。インデックス３は、ＣＯＮＳＴＡＮＴ＿Ｃｌａｓｓはクラスへの参照を表している。インデックス３は、インデックス１５の名前を持ったクラスへの参照であり、インデックス１５のＣＯＮＳＴＡＮＴ＿Ｕｔｆ８は、クラス、メソッド、フィールドの名前を表している。インデックス１５の例ではクラスの名前は“Ｓａｍｐｌｅ”である。インデックス１３のＣＯＮＳＴＡＮＴ＿ＮａｍｅＡｎｄＴｙｐｅは、メソッドやフィールドの名前と型記述子の参照を表す。型記述子とは、フィールドの型や、メソッドの引数、戻り値の型を文字列で表現したものである。インデックス１３の例では、このコンスタントプール３０２は名前がインデックス８、型記述子がインデックス１８である。その値は、それぞれ”＜ｉｎｉｔ＞“、”（）Ｖ“である。つまり、インデックス１のメソッド参照は、名前が”＜ｉｎｉｔ＞“で型記述子が”（）Ｖ“であるメソッドへの参照になる。また、インデックス２のＣＯＮＳＴＡＮＴ＿ＦｉｅｌｄＲｅｆはこのコンスタントプール３０２がフィールドへの参照であることを表している。インデックス２は、クラス”Ｓａｍｐｌｅ“で定義された、名前が”ｆｉｅｌｄ“で、型記述子が”Ｉ“のフィールドを参照している。
【００６３】
図１３は、クラス１１００のクラス構造情報３０１の一部である。ｔｈｉｓ＿ｃｌａｓｓ１３０１はクラス１１００の名前への参照である。クラスの名前はコンスタントプール３０２のインデックス１５に記録されている。ｓｕｐｅｒ＿ｃｌａｓｓ１３０２は、クラス１１００の親クラスである。ｆｉｌｅｄ＿ｃｏｕｎｔ１３０３は、クラス１１００で定義されているフィールドの数を表す。フィールドは、メソッドの処理結果などを記憶させることができる領域である。フィールド情報１３０４は、クラス１１００で定義されているフィールドの名前、アクセス権などの情報が記録されている。ｍｅｔｈｏｄ＿ｃｏｕｎｔ１３０５は、クラス１１００で定義されているメソッドの数を表す。メソッド情報１３０６は、クラス１１００で定義されているメソッドの名前、バイトコードのアドレスなどが記録されている。
【００６４】
図１４は、クラス１１００で定義されているメソッド１１０４のバイトコード３０３である。バイトコード３０３からは、コンスタントプール３０２を使いクラス、フィールド、メソッドへアクセスする。たとえば、命令１４０１ではインデックス３のコンスタントプール３０２を参照している。
バイトコードインタプリタ２０１は、バイトコード３０３の実行時に、コンスタントプール３０２を参照している命令、つまり図１４で＃の記号によりコンスタントプール３０２のインデックスを指定している命令があると、メタ情報管理部１３１にコンスタントプール解決処理を依頼し、コンスタントプール解決処理により得られた情報を用いて命令の処理をする。バイトコードインタプリタ２０１は、コンスタントプール３０２のインデックスを指定していない命令は独自に実行する。ここで、コンスタントプール解決処理とは、コンスタントプール３０２において文字列で表現されているクラス、フィールド、メソッドが第１ＲＡＭ１２５内のどのアドレスに記憶されているかを調べる処理のことである。
【００６５】
図１５は、図１４の命令１４０１を実行する処理のフローチャートである。
図１５において、バイトコードインタプリタ２０１は、命令１４０１をフェッチする。命令１４０２は、コンスタントプール３０２のインデックス３の位置に記憶されているクラス型のオブジェクトを生成する命令である。コンスタントプール３０２は、第２ＲＡＭ１３５が記憶しているため、バイトコードインタプリタ２０１はコンスタントプール３０２へアクセスできない。そのため、バイトコードインタプリタ２０１はメタ情報管理部１３１へ、命令１４０１の内容を通知する。（Ｓ１５０１）。メタ情報管理部１３１は、命令１４０１を読み出し、命令１４０１が参照するインデックス３で、第２ＲＡＭ１３５が記憶するコンスタントプール３０２を検索する（Ｓ１５０２）。本実施の形態では、クラス名“Ｓａｍｐｌｅ”が得られる。
【００６６】
次に、メタ情報管理部１３１は、“Ｓａｍｐｌｅ”クラスのクラス構造情報３０１からオブジェクトのサイズを計算する。（Ｓ１５０３）。ここで、オブジェクトのサイズは、そのクラスが宣言するフィールドの数と型記述子から計算される。たとえば“Ｓａｍｐｌｅ”クラスの場合ｉｎｔ型のフィールドを１つ持つため、オブジェクトサイズは４（バイト）になる。
【００６７】
次に、メタ情報管理部１３１は“Ｓａｍｐｌｅ”クラスを表すクラスＩＤを生成する（Ｓ１５０４）。クラスＩＤは、生成されたオブジェクトがどのクラスから生成されたのかを識別するために用いる情報である。クラスＩＤはたとえば３２ビットの整数値を用いて実現できる。メタ情報管理部１３１は、クラスＩＤと、クラス名で代表するクラス構造情報３０１との対応関係を、第２ＲＡＭ１３４が記憶するクラスＩＤ対応テーブルに記憶させる。
【００６８】
図１６は、クラスＩＤ対応テーブルの一例を示す図である。列１６１０はクラス名を表しており、列１６１１はクラスＩＤを表している。たとえば行１６０１の例では“Ｓａｍｐｌｅ”のクラス名で代表するクラス構造情報３０１は、クラスＩＤが１と対応付けられていることを表している。
図１５に戻って、メタ情報管理部１３１は、Ｓ１５０３で計算したオブジェクトサイズと、Ｓ１５０４で生成したクラスＩＤを第１ＲＡＭ１２５へ記憶させ、バイトコードインタプリタ２０１へ通知する（Ｓ１５０５）。その後、バイトコードインタプリタ２０１は通知されたオブジェクトサイズ分のメモリを確保し（Ｓ１５０６）、オブジェクトヘッダに通知されたクラスＩＤを記録する（Ｓ１５０７）。ここで、オブジェクトヘッダは、オブジェクトに関する様々な情報を記録する領域である。
【００６９】
以上の処理により、バイトコードインタプリタ２０１は、メタ情報を知ることなく、命令１４０１を実行することができる。この時、悪意のある第三者がコンスタントプール３０２の内容の盗聴を試みても、コンスタントプール３０２は第２ＲＡＭ１３５に記録されているため盗聴することができない。また、悪意のある第三者がバイトコードインタプリタ２０１とメタ情報管理部１３１間の通信内容を盗聴したとしても、コンスタントプール３０２のインデックスと、確保すべきオブジェクトサイズが得られるだけであり、コンスタントプールの内容は漏洩しない。つまり、悪意のある第三者からコンスタントプール３０２の内容を秘匿することができる。
【００７０】
なお、クラスＩＤ対応テーブル１６００において、クラスＩＤとクラス構造情報３０１の対応は必ずしも１対１である必要はない。
図１７は、ひとつのクラス構造情報３０１に対し複数のクラスＩＤが対応する例を示す図である。このように構成することにより、デバッガなどのツールが第１ＲＡＭ１２５を盗聴したときに、どのオブジェクトがどのクラスに対応するものか解析することが困難になる。
【００７１】
続いて、命令１４０２〜命令１４０３は、コンスタントプール３０２への参照を含まないため、バイトコードインタプリタ２０１はメタ情報管理部１３１を呼び出すことなく命令を実行することができる。命令１４０４は、コンスタントプール３０２への参照を伴う命令である。命令１４０４は、第２ＲＡＭ１３５が記憶するコンスタントプール３０２のインデックス２の位置に記憶されているクラス名、メソッド名で表されるメソッドのバイトコードを呼び出す命令である。
【００７２】
図１８は、バイトコードインタプリタ２０１が、命令１４０４を実行する処理のフローチャートである。
バイトコードインタプリタ２０１は、命令１４０４をフェッチし、命令１４０４の内容と、レシーバオブジェクトのアドレスをメタ情報管理部１３１へ通知する（Ｓ１８０１）。
【００７３】
ここで、レシーバオブジェクトとは、メソッドを実行する対象のオブジェクトのことである。Ｊａｖａ（登録商標）言語では、メソッドの処理はレシーバオブジェクトが記憶するフィールドを用いて行われる。メタ情報管理部１３１は、レシーバオブジェクトのオブジェクトヘッダに記憶されているクラスＩＤを、第２ＲＡＭ１３４が記憶するクラスＩＤ対応テーブル１６００から検索し、クラスＩＤに対応するクラス構造情報３０１を検索する（Ｓ１８０２）。図１６に示すように、クラスＩＤは「１」であるので、図１３のクラス構造情報３０１が検索される。
【００７４】
次に、メタ情報管理部１３１は、コンスタントプール３０２からインデックス４を検索し、メソッド名“＜ｉｎｉｔ＞”と型記述子”（）Ｖ“を得る（Ｓ１８０３）。次に、メタ情報管理部１３１は、Ｓ１８０２で検索したクラス構造情報３０１に含まれるメソッド情報１３０６から、Ｓ１８０３で検索したメソッド名と型記述子を持つメソッドを検索し、そのバイトコードアドレスを得る（Ｓ１８０４）。次に、メタ情報管理部１３１は、Ｓ１８０４で得たバイトコードアドレスをインタプリタ２０１へ通知する（Ｓ１８０５）。バイトコードインタプリタ２０１は、メタ情報管理部１３１から通知されたバイトコードアドレスを実行する（Ｓ１８０６）。
【００７５】
以上の動作によりバイトコードインタプリタ２０１は、メタ情報を知ることなく命令１４０４を実行することができる。この時、悪意のある第三者がコンスタントプール３０２の内容の盗聴を試みても、コンスタントプール３０２は第２ＲＡＭ１３５に記録されているため盗聴することができない。また、悪意のある第三者がバイトコードインタプリタ２０１とメタ情報管理部１３１間の通信内容を盗聴したとしても、コンスタントプール３０２のインデックスと、次に実行すべきバイトコードアドレスが得られるだけであり、コンスタントプールの内容は漏洩しない。つまり、悪意のある第三者からコンスタントプール３０２の内容を秘匿することができる。
【００７６】
続いて、命令１４０５〜命令１４０６は、コンスタントプール３０２への参照を含まないため、バイトコードインタプリタ２０１はメタ情報管理部１３１を呼び出すことなく命令を実行することができる。
命令１４０７は、コンスタントプール３０２への参照を伴う命令である。命令１４０７は、第２ＲＡＭ１３５が記憶するコンスタントプール３０２のインデックス２の位置に記憶されている、クラス名、フィールド名で表されるフィールドを読み出す命令である。コンスタントプール３０２は、第２ＲＡＭ１３５が記憶しているため、バイトコードインタプリタ２０１はコンスタントプール３０２へアクセスできない。図１９は、バイトコードインタプリタ２０１が、命令１４０７を実行する処理のフローチャートである。
【００７７】
バイトコードインタプリタは命令１４０７をフェッチすると、メタ情報管理部１３１を呼び出し、命令１４０７の内容と、命令１４０７の実行直前のＪａｖａ（登録商標）スタックの最上位にあるオブジェクトのアドレスを通知する（Ｓ１９０１）。
ここで、Ｊａｖａ（登録商標）スタックについては「Ｊａｖａ（登録商標）  Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ」を参照されたい。
【００７８】
メタ情報管理部１３１は、通知されたオブジェクトのオブジェクトヘッダに記憶されているクラスＩＤを、第２ＲＡＭ１３４が記憶するクラスＩＤ対応テーブル１６００から検索し、クラスＩＤに対応するクラス構造情報３０１を検索する。（Ｓ１９０２）本実施の形態では、クラスＩＤは「１」であるので、クラス構造情報３０１が検索される。
次に、メタ情報管理部１３１は、コンスタントプール３０２からインデックス２を検索し、フィールド名“ｆｉｅｌｄ”と型記述子”Ｉ“を得る。（Ｓ１９０３）次に、メタ情報管理部１３１は、Ｓ１９０２で検索したクラス構造情報３０１に含まれるフィールド情報１３０４から、Ｓ１９０３で検索したフィールド名と型記述子を持つフィールドを検索し、そのフィールドのアドレスを得る。（Ｓ１９０４）次に、メタ情報管理部１３１は、第１ＲＡＭ１２５へ、Ｓ１９０４で得たフィールドアドレスを記憶させ、バイトコードインタプリタ２０１へそのアドレスを通知する（Ｓ１９０５）。バイトコードインタプリタ２０１は、メタ情報管理部１３１から通知されたフィールドアドレスを読み取る（Ｓ１９０６）。
【００７９】
以上の動作により、バイトコードインタプリタ２０１は、メタ情報を知ることなく命令１４０７を実行することができる。この時、悪意のある第三者がコンスタントプール３０２の内容の盗聴を試みても、コンスタントプール３０２は第２ＲＡＭ１３５に記録されているため盗聴することができない。また、悪意のある第三者がバイトコードインタプリタ２０１とメタ情報管理部１３１間の通信内容を盗聴したとしても、コンスタントプール３０２のインデックスと、データを読み出すためのフィールドのアドレスが得られるだけであり、コンスタントプールの内容は漏洩しない。つまり、悪意のある第三者からコンスタントプール３０２の内容を秘匿することができる。
【００８０】
以上に説明したように、メタ情報（クラス構造情報３０１、コンスタントプール３０２）はデバッガからアクセスすることができない第２ＲＡＭ１３４のみが記憶するため、悪意のある第三者がデバッガなどのツールを使ってＪａｖａ（登録商標）アプリケーションの不正コピーを試みても、メタ情報が取得できない。また、Ｊａｖａ（登録商標）アプリケーションの実行時に、データの盗聴、改ざんを試みても、メタ情報を読み出すことができないため、どのメソッドやデータを盗聴、改ざんすればよいかが分からず、攻撃が非常に困難になる。
【００８１】
なお、アプリ取得プログラム１２１、Ｊａｖａ（登録商標）仮想マシン１２２は、第１ＣＰＵ１２４で実行されるソフトウェアで実現されるとしたけれども、ＬＳＩ等のハードウェアで実現されてもよいのは勿論である。
（実施の形態２）
上記実施の形態１では、クラスローダ２０２やベリファイヤ２０３はＪａｖａ（登録商標）仮想マシン１２２のサブプログラムとして通常実行部１２０で動作している。このため、図１０に示したクラスロード処理のＳ１００１完了後から、Ｓ１００５までの間にデバッガ等のツールで第１ＲＡＭ１２５を盗聴することで、メタ情報が漏洩する課題がある。本実施の形態２では、クラスローダ２０２、ベリファイヤ２０３を安全な実行部１３０で動作させることによりこの課題を解決する。
【００８２】
図２０は、実施の形態２におけるアプリケーション実行装置の構成を示すブロック図である。
本実施の形態におけるアプリケーション実行装置２０１０は、実施の形態１におけるアプリケーション実行装置１１０と比べ、第１Ｊａｖａ（登録商標）仮想マシン２０２２、第２Ｊａｖａ（登録商標）仮想マシン２０３２、復号処理部２０３４が異なる。その他の構成要素については、実施の形態１と同様であるため説明を省略する。
【００８３】
図２１は、第１Ｊａｖａ（登録商標）仮想マシン２０２２、第２Ｊａｖａ（登録商標）仮想マシン２０３２のサブプログラムの構成を示す図である。
クラスローダ２１０６、ベリファイヤ２１０７は、安全な実行部２０３０で実行するため第２Ｊａｖａ（登録商標）仮想マシン２０３２のサブプログラムとする。
また、図２２に示すように、第１ＲＯＭ２０２６は、第１Ｊａｖａ（登録商標）仮想マシン２２０１、第２Ｊａｖａ（登録商標）仮想マシン２２０２を記憶している。
【００８４】
図２３は、Ｊａｖａ（登録商標）仮想マシンローダ２０３３が、第１Ｊａｖａ（登録商標）仮想マシン２０２２、第２Ｊａｖａ（登録商標）仮想マシン２０３２をロードする処理手順を示すフローチャートである。
図２３のＳ２３０１で、Ｊａｖａ（登録商標）仮想マシンローダ２０３３は、復号処理部２０３４へ、第１Ｊａｖａ（登録商標）仮想マシン２２０１を復号し、結果を第１ＲＡＭ２０３６へ出力するよう指示する。
【００８５】
そして、Ｊａｖａ（登録商標）仮想マシンローダ２０３３は、復号処理部２０３４に対し、第２Ｊａｖａ（登録商標）仮想マシン２２０２を復号し、結果を第２ＲＡＭ２０３６へ出力するよう指示する（Ｓ２３０２）。最後に、ＯＳ２０２３へロードの完了を通知する（Ｓ２３０３）。
以上でＪａｖａ（登録商標）仮想マシンをロードすることができる。
【００８６】
クラスのロード処理は、クラスローダ２１０６、ベリファイヤ２１０７の動作を安全な実行部２０１０で実行すること以外は、実施の形態１と同様のため説明を省略する。また、クラスの実行処理も、実施の形態１と同様であるため説明を省略する。
以上のように構成することにより、クラスのロード処理の処理中のときでも、復号されたメタ情報のデバッガなどのツールによる盗聴、改ざんを防ぐことができる。
【００８７】
なお、実施の形態１および実施の形態２ではＪａｖａ（登録商標）アプリケーションを実行するアプリケーション実行装置を例に説明したが、本発明はメタ情報を持つ他の言語で記述されたアプリケーションにも適用が可能である。たとえば、ＥＣＭＡで標準化されているＣ＃言語は、ＣＩＬ（Ｃｏｍｍｏｎ  Ｉｎｔｅｒｍｅｄｉａｔｅ  Ｌａｎｇｕａｇｅ）と呼ばれる中間言語（Ｊａｖａ（登録商標）におけるバイトコードに相当）をＣＬＩ（Ｃｏｍｍｏｎ  Ｌａｇｕａｇｅ  Ｉｎｆｒａｓｔｒｕｃｔｕｒｅ）と呼ばれる仮想マシン（Ｊａｖａ（登録商標）におけるＪａｖａ（登録商標）仮想マシンに相当）が実行する方式をとる。Ｃ＃言語におけるメタ情報はＥＣＭＡ−３５５規格のＰａｒｔｉｔｉｏｎ  ＩＩで定義されている。
【００８８】
なお、実施の形態１、実施の形態２では、クラスファイルに含まれるすべてのメタ情報を、第２ＲＡＭ１３５のみへ記憶させたが、一部のメタ情報を第１ＲＡＭ１２５へ記憶させてもよい。この場合、第１ＲＡＭ１２５へ記憶させた情報については、デバッガなどのツールにより解析される恐れがあるが、通常の実行部１２０と安全な実行部１３０とのインタラクションを削減できるため、より速くアプリケーションを実行できるようになる。
【００８９】
一部のメタ情報だけでは完全なクラスを復元することはできないが、入手したメタ情報から他のメタ情報を推定することで完全なクラスを復元することができる可能性がある。どれだけのメタ情報を隠蔽すれば十分であるかは、実行プログラムに求められる保護要件に基づき決定すればよい。
【産業上の利用可能性】
【００９０】
本発明に係るアプリケーション実行装置は、アプリケーションの実行、解析に不可欠なメタ情報を、盗聴、改ざんが困難な安全実行部へと隠蔽することで、アプリケーションを実行時の盗聴、改ざんから保護することができ、アプリケーションのダウンロード配信ビジネスにおいて、コンテンツ作成者の権利を保護することができる。
【図面の簡単な説明】
【００９１】
【図１】本発明に係るアプリケーション実行装置の実施の形態１の構成図である。
【図２】上記実施の形態のＪａｖａ（登録商標）仮想マシンの構成を示す図である。
【図３】上記実施の形態のＪａｖａ（登録商標）クラスファイルの構造図である。
【図４】上記実施の形態の第１ＲＯＭに記憶されている情報の一例の構成図である。
【図５】上記実施の形態のアプリ取得プログラムの構成の一例の構造図である。
【図６】上記実施の形態のメタ情報の処理手順を示すフローチャートである。
【図７】上記実施の形態の第２ＲＯＭに記憶されている情報の一例の構成図である。
【図８】上記実施の形態のＪａｖａ（登録商標）仮想マシンをロードする処理手順を示すフローチャートである。
【図９】上記実施の形態の復号の処理手順を示すフローチャートである。
【図１０】上記実施の形態のクラスをロードする処理手順を示すフローチャートである。
【図１１】上記実施の形態のＪａｖａ（登録商標）クラスの一例を示す図である。
【図１２】上記実施の形態のコンスタントプールの一例を示す図である。
【図１３】上記実施の形態のクラス構造情報の一例を示す図である。
【図１４】上記実施の形態のバイトコードの一例を示す図である。
【図１５】上記実施の形態のバイトコードのｎｅｗ命令の処理手順を示すフローチャートである。
【図１６】上記実施の形態のクラスＩＤ対応テーブルの一例を表す図である。
【図１７】上記実施の形態のクラスＩＤ対応テーブルの別の一例を表す図である。
【図１８】上記実施の形態のｉｎｖｏｋｅｓｐｅｃｉａｌ命令を実行する際のバイトコードインタプリタおよびメタ情報管理部のフローチャートである。
【図１９】上記実施の形態のｇｅｔｆｉｅｌｄ命令を実行する際のバイトコードインタプリタおよびメタ情報管理部のフローチャートである。
【図２０】本発明に係るアプリケーション実行装置の実施の形態２の構成図である。
【図２１】上記実施の形態の仮想マシンの構成を示す図である。
【図２２】上記実施の形態の第１ＲＯＭに記憶されている情報の一例を示す図である。
【図２３】上記実施の形態のＪａｖａ（登録商標）仮想マシンをロードする処理手順を示すフローチャートである。
【符号の説明】
【００９２】
１００，２０００  ダウンロード可能なプログラム
１１０，２０１０  アプリケーション実行装置
１２０，２０２０  通常実行部
１２１，２０２１  アプリ取得プログラム
１２２  Ｊａｖａ（登録商標）仮想マシン
１２３，２０２３  ＯＳ
１２４，２０２４  第１ＣＰＵ
１２５，２０２５  第１ＲＡＭ
１２６，２０２６  第１ＲＯＭ
１３０，２０３０  安全な実行部
１３１，２０３１  メタ情報管理部
１３２，２０３３  Ｊａｖａ（登録商標）仮想マシンローダ
１３３，２０３４  復号処理部
１３４，２０３５  第２ＣＰＵ
１３５，２０３６  第２ＲＡＭ
１３６，２０３７  第２ＲＯＭ
２０１，２１０１  バイトコードインタプリタ
２０２，２１０６  クラスローダ
２０３，２１０７  ベリファイヤ
２０４，２１０３  Ｊａｖａ（登録商標）ヒープ管理部
２０５，２１０４  Ｊａｖａ（登録商標）ネイティライブラリ
２０６，２１０５  ＪＩＴコンパイラ
３００  クラスファイル
３０１  クラス構造情報
３０２  コンスタントプール
３０３  バイトコード
４０１  暗号化されたＪａｖａ（登録商標）仮想マシン
４０２  暗号化されたアプリ取得プログラム
４０３  暗号化されたメタ情報管理部
４０４  起動クラス名
５０１  暗号化されたサブクラス
７０１  復号鍵
１１００  Ｊａｖａ（登録商標）言語によるクラス定義ファイル
１６００  クラスＩＤ対応テーブル（例１）
１７００  クラスＩＤ対応テーブル（例２）
２０２２  第１Ｊａｖａ（登録商標）仮想マシン
２０３２  第２Ｊａｖａ（登録商標）仮想マシン
【手続補正３】
【補正対象書類名】図面
【補正対象項目名】全図
【補正方法】変更
【補正の内容】
【図１】
2006009081.tif 000025
【図２】
2006009081.tif 000026
【図３】
2006009081.tif 000027
【図４】
2006009081.tif 000028
【図５】
2006009081.tif 000029
【図６】
2006009081.tif 000030
【図７】
2006009081.tif 000031
【図８】
2006009081.tif 000032
【図９】
2006009081.tif 000033
【図１０】
2006009081.tif 000034
【図１１】
2006009081.tif 000035
【図１２】
2006009081.tif 000036
【図１３】
2006009081.tif 000037
【図１４】
2006009081.tif 000038
【図１５】
2006009081.tif 000039
【図１６】
2006009081.tif 000040
【図１７】
2006009081.tif 000041
【図１８】
2006009081.tif 000042
【図１９】
2006009081.tif 000043
【図２０】
2006009081.tif 000044
【図２１】
2006009081.tif 000045
【図２２】
2006009081.tif 000046
【図２３】
2006009081.tif 000047
【国際調査報告】
2006009081.tif 000048
2006009081.tif 000049
2006009081.tif 000050