LibeSIM

山本 真基

2026/11/03 01:00

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

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等行っておりますので、ぜひお問い合わせください。

https://common-creation.com/service/libesim

山本 真基

山本 真基

コモン・クリエーション株式会社

執行役員 LibeSIM事業責任者

当社にて、eSIM Tech Partner「LibeSIM」の立ち上げ・事業推進を主導。SM-DP+・eIM・MVNOをワンストップで提供し、eSIMの運用に必要なすべてをオープンに選択できる環境の実現を目指す。国内唯一のeIMプロバイダーとして、SGP.32時代のIoT接続管理の最前線に立つ。