JavaCardとは?SIMの中でアプレットが動く仕組みを詳しく解説

無料ウェビナーのご案内
SIM・eSIMの基本を、動画でも学んでみませんか?
本ウェビナーでは、SIMカードとeSIMの違い、eUICC・プロファイル・SM-DP+の関係、プロファイルを遠隔で書き込む仕組みなどを、図を交えて約15分で解説します。
記事とあわせて全体像を整理したい方や、業務でeSIMを扱い始めた方におすすめです。学び直しや社内での情報共有にもご活用ください。
今すぐ申し込む(無料)
こんにちは、コモン・クリエーションでIoT・SIMエンジニアリングサービスの事業責任者をしている山本です。 本記事では、SIMカードの中でアプリケーション(アプレット)を動かしている実行環境、JavaCard を解説します。
はじめに
現代のSIMカード(UICC)は、単なるデータの入れ物ではなく、プログラムを実行できる小さなコンピュータです。USIMアプリケーションも、OTAで配信される付加機能も、その多くは JavaCard の「アプレット」として動いています。SIM/eSIMの内部を理解するうえで、JavaCard は避けて通れない基盤技術です。
本稿では、以下の項目を JavaCard 3.1 の仕様に基づいて整理します。
JavaCardとは何か、なぜSIMカードで採用されているのか
JavaCard VM(仮想マシン)とRE(ランタイム環境)の構成
CAPファイル — アプレットの配布形式と、開発からカード搭載までの流れ
アプレットのライフサイクル(インストール・選択・実行・削除)
Toolkitアプレット — SIMならではのイベント駆動アプレット
1. まず全体像から — JavaCardをざっくり理解する
JavaCard(正式名称 Java Card Platform。Oracle が仕様を策定する、スマートカード向けの Java 実行環境)は、一言でいえば「SIMカードの中でアプリを動かすための土台」です。
スマートフォンとの対比で考えると分かりやすくなります。スマートフォンにはOSがあり、その上にアプリをインストールして機能を追加できます。SIMカードでも同じことが起きています。カードのOSの上に JavaCard という実行環境があり、そこにアプレット(Applet。カード上で動く小さなアプリケーション)をインストールして機能を追加できます。アプリの追加・削除に相当する管理の仕組みは GlobalPlatform が担います(詳細は GlobalPlatformとセキュリティドメイン で扱います)。
JavaCardが業界標準になった理由は、Java の「Write Once, Run Anywhere」をスマートカードに持ち込んだことにあります。カードのCPUやメモリ構成はベンダーごとに異なりますが、JavaCard 仕様に準拠したカードであれば同じバイナリ(CAPファイル)がそのまま動きます。このバイナリポータビリティの提供こそが仕様の目的です(JavaCard 3.1 VM仕様 §1.1)。
SIMの世界での実例としては、加入者認証を担う USIM/ISIM そのもの、通信事業者が配信するToolkitアプレット、IoT SAFE のセキュリティアプレットなどが、いずれも JavaCard アプレットとして実装されています。
なお、JavaCard 3.1 には Classic Edition と Connected Edition がありますが、SIM/eUICCで使われるのは Classic Edition です。本稿も Classic Edition を前提とします。
2. JavaCardプラットフォームの構成 — VMとRE
2-1. 2つに分かれた仮想マシン
JavaCard の仮想マシン(JCVM、Java Card Virtual Machine)は、通常の Java VM と違い、2つの部分に分割されています(JavaCard 3.1 VM仕様 §1.2、Figure 1-1/1-2)。
構成要素 | 動作場所 | 役割 |
|---|---|---|
Converter(コンバータ) | オフカード(開発PC) | クラスファイルを検証・リンク・最適化し、CAPファイルへ変換する |
インタプリタ | オンカード(カード内) | CAPファイル内のバイトコードを実行する |
クラスのロードや検証といった重い処理を開発PC側(オフカード)で済ませておき、カード側(オンカード)は実行に専念する。この分担が、8ビット/16ビット級のプロセッサと数十KB程度のメモリしか持たないカードで Java を動かすための設計上の答えです。
2-2. JCRE — カード上のランタイム環境
JCRE(Java Card Runtime Environment)は、オンカードのインタプリタに加えて、APIクラスライブラリとシステムサービスをまとめた実行環境の総称です。JCREは次の仕事を担います。
端末から届くAPDUを、選択中のアプレットに振り分ける(ディスパッチ)
アプレットのライフサイクル(インストール・選択・削除)を管理する
アプレットファイアウォール — アプレットごとに「コンテキスト」を分離し、他アプレットのオブジェクトへの直接アクセスを禁止する(共有は Shareable インターフェース経由のみ)
永続オブジェクト(不揮発メモリ)と一時オブジェクト(RAM)の管理、トランザクションによる原子性の保証
1枚のカードでUSIMと第三者のアプレットが同居しても互いに干渉できないのは、このファイアウォールのおかげです。
2-3. Javaとの違い — 使える言語機能のサブセット
JavaCard は Java 言語のサブセットです。カードの資源制約に合わせて、次の機能が省かれています(JavaCard 3.1 VM仕様 §2.2)。
項目 | Java | JavaCard(Classic) |
|---|---|---|
基本データ型 | 全型 | char / double / float / long は非対応。int は任意サポート |
配列 | 多次元可 | 1 次元のみ |
スレッド | あり | なし |
動的クラスロード | あり | なし |
セキュリティマネージャ | java.lang.SecurityManager | なし(ファイアウォールで分離を実現) |
「short を基本に、int すら任意」という割り切りが、JavaCard の性格をよく表しています。
3. CAPファイル — アプレットの配布形式
3-1. 開発からカード搭載までの流れ
アプレット開発は通常の Java 開発と同じく javac でのコンパイルから始まり、その後 JavaCard 固有の変換工程に入ります。

CAPファイル(Converted Applet。1つ以上のJavaパッケージを変換した、ロード可能なバイナリ形式)が JavaCard における配布の単位です。Java における class ファイルに相当する、バイナリ互換性の基準です(VM仕様 §3.9)
exportファイル — パッケージの公開リンク情報を含むファイル。他のパッケージ(たとえば
javacard.frameworkや TS 102 241 のAPI)を参照するコードを変換する際に Converter への入力として使いますVerifier(検証ツール) — CAPファイルの構造と型安全性を検査し、参照偽造などでVMの整合性を壊すコードを排除します
カードへのロードとインストールは JavaCard 仕様の範囲外で、実務では GlobalPlatform の INSTALL/LOAD コマンド、遠隔なら OTA の RAM(Remote Applet Management)を使います(OTA/RFM/RAM 参照)。
3-2. CAPファイルの中身
CAPファイルは Header、Directory、Import、Applet、Class、Method、StaticField、Export などのコンポーネントの集合として構成されます(参照ロード順は VM仕様 §6.3)。Applet コンポーネントには、そのCAPファイルに含まれるアプレットクラスとAIDが列挙されます。
パッケージには2種類あります。javacard.framework.Applet のサブクラス(具象クラス)を1つ以上含むものがアプレットパッケージ、含まないものがライブラリパッケージです(VM仕様 §1.2)。JavaCard 3.1 では従来の Compact 形式に加えて Extended 形式(拡張子 .capx)が定義され、アプリケーション単位でのCAPファイル構成が可能になりました。
4. アプレットのライフサイクル
アプレットは「CAPロード → インストール → 選択可能 → 選択中 → 削除」という状態遷移をたどります。JCRE は install / select / process / deselect の各メソッドを通じてアプレットとやり取りします(JCRE仕様 v3.1 §3.1〜3.4)。アプレットクラスの骨格は次のとおりです。
public class MyApplet extends Applet {
public static void install(byte[] bArray, short bOffset, byte bLength) {
// インストール時に JCRE から一度だけ呼ばれる
new MyApplet().register(); // AID を JCRE に登録する
}
public void process(APDU apdu) {
// 選択中、APDU が届くたびに呼ばれる
byte[] buf = apdu.getBuffer();
// CLA / INS を見て処理を分岐する
}
}
ポイントは3つです。
install() — インストール時に一度だけ呼ばれ、インスタンスを生成して
register()でAIDを登録します。オブジェクトの確保はここで済ませるのが定石ですselect() / deselect() — 端末が SELECT コマンドでAIDを指定すると選択状態になり、以後のAPDUがそのアプレットに届きます
process() — APDUが届くたびに呼ばれる本体です。USIMの AUTHENTICATE 処理も、USIMアプレットの process() が受けています
「アプレット = AIDで選択され、APDUで会話するオブジェクト」
削除も含めたロード・インストール・削除の管理主体はカード発行者であり、GlobalPlatform のセキュリティドメインの権限で制御されます。
5. Toolkitアプレット — SIMならではのアプレット
前章までのアプレットは「端末に選択され、APDUを待つ」受け身の存在です。しかしSIMの実務でよく登場するのは、もう一段特殊な Toolkitアプレット です。ETSI TS 102 241(UICC API for Java Card)が定義するAPIを使うアプレットで、次の点が通常のアプレットと異なります。
SELECTではなく、イベント(EVENT_MENU_SELECTION、EVENT_EVENT_DOWNLOAD_LOCATION_STATUS など、TS 102 241 §6.2 の定数で表される)によって起動される
ToolkitRegistry(uicc.toolkit.ToolkitRegistry)に受け取りたいイベントを登録しておき、イベント発生時に CAT Runtime Environment が ToolkitInterface の processToolkit() メソッドを呼び出す
Proactive Command(カード側から端末に依頼を出す、Card Application Toolkit の仕組み)を ProactiveHandler API 経由で発行でき、画面表示、SMS送信、位置情報の取得などをカード側から仕掛けられる
イベント駆動と Proactive Command の組み合わせにより、「SMSで届いた指示を受けて位置情報を取得し、結果をSMSで返す」といった自律的な動作が可能になります。この土台の詳細は Card Application Toolkit(USAT) で扱います。
eSIMの文脈でも JavaCard は現役です。eUICC の OS は JavaCard ベースが主流で、プロファイルの中にアプレットを含めてダウンロードすることもできます。IoT SAFE のアプレットや SGP.32 の IPAe も、JavaCard アプレットとして実装される代表例です。
まとめ
JavaCard はスマートカード向けの Java 実行環境で、SIM/eUICC のアプリケーション基盤の事実上の標準である
JCVM はオフカードの Converter とオンカードのインタプリタに分割され、資源の乏しいカードでもバイナリポータビリティを実現している
配布形式は CAPファイル。クラスファイルを Converter で変換・検証し、GlobalPlatform の仕組みでカードにロード・インストールする
アプレットは install() で生成・登録され、AIDで選択され、process() でAPDUを処理する。アプレットファイアウォールが相互の分離を保証する
Toolkitアプレットはイベント駆動で動作し、Proactive Command を発行できる。USIM、OTA配信機能、IoT SAFE、IPAe など、SIMの主要機能の多くがアプレットとして実装されている
SIMカードを「認証情報の入れ物」ではなく「アプレットが動くプラットフォーム」として捉え直すと、OTA・Toolkit・eSIMの各技術が一本の線でつながります。
参考規格
Oracle Java Card Platform Virtual Machine Specification, Classic Edition, Version 3.1
Oracle Java Card Platform Runtime Environment Specification, Classic Edition, Version 3.1
Oracle Java Card Platform Application Programming Interface, Classic Edition, Version 3.1
ETSI TS 102 241 — UICC Application Programming Interface (UICC API) for Java Card
ETSI TS 102 223 — Card Application Toolkit (CAT)
ETSI TS 102 226 — Remote APDU structure for UICC based applications
GlobalPlatform Card Specification v2.3.1
おわりに
弊社では「LibeSIM」として、SM-DP+やMVNO回線、eIM(eSIM IoT Remote Manager)、eUICC、IPA/LPAのご提供を行っております。 ご興味がございましたら、デモやPoC等行っておりますので、ぜひお問い合わせください。

山本 真基
コモン・クリエーション株式会社
執行役員 LibeSIM事業責任者
当社にて、eSIM Tech Partner「LibeSIM」の立ち上げ・事業推進を主導。SM-DP+・eIM・MVNOをワンストップで提供し、eSIMの運用に必要なすべてをオープンに選択できる環境の実現を目指す。国内唯一のeIMプロバイダーとして、SGP.32時代のIoT接続管理の最前線に立つ。
