Terminal Capability
「Terminal Capability」は、もともと ETSI TS 102 221(UICC/USIMのカード-端末インタフェース仕様)で定義されている仕組みです。
ざっくり言うと、端末(ターミナル)が“自分は何ができるか”をカード(UICC/eUICC)へ通知するための枠組みです。
ここで大事なのは、Terminal Capability自体は「eSIM向けの仕組み」ではなく、SIM/UICCの世界で一般的に使われてきた“端末能力の通知” だという点です。
「チャネルを開く必要がある/ない」はSIMベンダで異なる
eUICCに対してAPDUを投げるとき、論理チャネル(Logical Channel)を使うかどうかが問題になることがあります。
一般論としては次のように整理できます。
- 基本チャネル(チャネル0): MF等へアクセスする際のチャネル
- 論理チャネル(チャネル1以降): セキュアドメイン/アプレットを扱うためのチャネル
実検証で厄介なのは、SIM/eUICCのベンダ実装によって「IPAd/IPAe切替を含むTerminal Capability」を送る際の前提(論理チャネルが必要かどうか)が異なる点です。
- あるSIMは 論理チャネルをOpenしてから でないと、IPAd/IPAe切替を含むTerminal Capabilityを受け付けない
- 別のSIMは、チャネルを開かず(基本チャネルのまま) でもIPAd/IPAe切替のTerminal Capabilityが通る
上の2パターンが混在するため、SIMを替えると成否やエラーの出方を考慮した切り分けが必要です。
SGP.32ではTerminal Capabilityを“再利用”してIPAd/IPAeを切替える
IoT eSIM(SGP.32)では、IoTデバイス特性に合わせて IPA(IoT Profile Assistant)が導入されます。
そして、そのIPAには「どこにIPAの主体がいるか」という配置の違いがあり、次の2つがよく登場します。
- IPAd: IPAが デバイス側にいる(IPA in Device)
- IPAe: IPAが eUICC側にいる(IPA in eUICC)
SGP.32は、この IPAd/IPAeの“どちらを使う前提か” を eUICC に知らせるため、既存の枠組みであるTerminal Capabilityを活用します。
つまり、
- Terminal Capabilityの枠組み(ETSI TS 102 221)を使いつつ
- SGP.32として追加の新しいタグを規定して
- そのタグ値でIPAd/IPAeの前提を切り替え(= eUICCに宣言する)
ます。SGP.32で「ゼロから新しい通知手段を作っている」のではなく既存のカード規格であるTerminal Capabilityに“SGP.32としての意味”を載せています。
ATコマンドからAPDUを送る(AT+CSIM)
モデム経由でeUICCへAPDUを送る場合、現段階では AT+CSIM の形で流すことが多く、概ね以下の順序になります。
1. Open Channel(論理チャネルを開く)
2. TERMINAL CAPABILITY を送信(ISD-R選択の前)
3. Select ISD-R(ISD-Rアプレットを選択)
4. 以降のES10b機能(EUICCInfo等)
基本形は次のイメージです(<LEN> はAPDUのHEX文字列長)。
AT+CSIM=<LEN>,"<APDU_HEX>"
論理チャネルをOpen/Closeする(MANAGE CHANNEL)
論理チャネルのオープン/クローズは、APDUレベルでは MANAGE CHANNEL(INS=70) を使います。
Open(OPEN)
-
APDU(HEX):
0070000001-
00 70 00 00 01(Le=01で「チャネル番号を1バイト返す」前提)
-
- AT+CSIM例:
AT+CSIM=10,"0070000001"
-
典型レスポンス:
01 9000- 先頭の
01が「オープンされた論理チャネル番号」、末尾9000は成功SW
- 先頭の
Close(CLOSE)
-
APDU(HEX):
007080XX00(XXは閉じたいチャネル番号)- 例: チャネル
01を閉じる →0070800100
- 例: チャネル
- AT+CSIM例:
AT+CSIM=10,"0070800100"
9000 が返ればクローズ成功です。
Terminal CapabilityでIPAd/IPAeを切り替える
Terminal Capability(INS=AA)は、APDUとしては次の形です。
CLA: 8x(論理チャネル。例: 81 = 論理チャネル1)
INS: AA(TERMINAL CAPABILITY)
P1: 00
P2: 00
Lc: データ長
Data: Terminal Capability TLV
送信データ(Terminal Capability TLV = Tag A9)
Terminal CapabilityのData部は TLV で、代表例として次の構造がよく出てきます。
A9 05
81 00
84 01 XX
- Tag
A9: Terminal Capability - Tag
81: Extended logical channels terminal support-
81 00は「拡張論理チャネルは使わない(Length 0)」を意味する形
-
- Tag
84: eUICC関連の追加能力(BIT STRING)- ここで IPAd/IPAeの前提を表すビットが使われます
IPAd / IPAe の切替(Tag 84の値)
IPAd/IPAeの違いは、ここでは Tag 84 の1バイト値(XX)として表現されます。
-
IPAd(IPA in Device):
84 01 01(b1=1) -
IPAe(IPA in eUICC):
84 01 00(b1=0)
APDU全体で見ると、例えば以下のようになります(論理チャネル1の例)。
IPAdを宣言する例:
AT+CSIM=24,"81AA000007A9058100840101"
IPAeを宣言する例:
AT+CSIM=24,"81AA000007A9058100840100"
まとめ
- Terminal Capabilityは ETSI TS 102 221 で定義される「端末能力の通知」の枠組み
- 実機では、論理チャネルをOpenしないとTerminal Capability(IPAd/IPAe切替を含む)が通らないSIM と、基本チャネルでも通るSIM が混在し得る
- SGP.32はTerminal Capabilityを活用し、追加タグ(例: Tag 84)で IPAd/IPAeの前提をeUICCへ宣言する
- モデム経由では
AT+CSIMでAPDUを流し、必要に応じて MANAGE CHANNEL(INS=70)でOpen/Close したうえで Terminal Capability(INS=AA)を送る