FeliCaカードユーザーズマニュアル (非公式版)

切敷 裕大*

2026年7月24日

*アンノウン・テクノロジーズ株式会社

おことわり

内容の確かさには万全を期しておりますが、リバースエンジニアリングの性質上、不正確な結果が含まれている場合がありますので、ご了承ください。

本文書では、特筆ない限り以下が前提です。

Contents

1 はじめに
2 FeliCaとは
3 通信プロトコル
3.1 コマンドパケット
3.2 レスポンスパケット
3.3 コマンド一覧
3.4 製造IDおよび製造パラメーター
4 ファイルシステム
4.1 システム
4.2 エリア
4.3 サービス
4.4 ブロック
5 モード
6 コマンド
6.1 ブロックリスト及びブロックリストエレメント
6.2 Polling
6.3 Request Service
6.4 Request Response
6.5 Read Without Encryption
6.6 Write Without Encryption
6.7 Search Service Code
6.8 Request System Code
6.9 Request Block Information
6.10 Authentication1
6.11 Authentication2
6.12 Read
6.13 Write
6.14 Get Node Property
6.15 Request Service v2
6.16 Get System Status
6.17 Request Specification Version
6.18 Reset Mode
6.19 Authentication1 v2
6.20 Authentication2 v2
6.21 Read v2
6.22 Write v2
6.23 Register Issue ID
6.24 Register Area
6.25 Register Service
6.26 Change System Block
6.27 ステータスフラグ
7 相互認証およびセキュアメッセージングアルゴリズム
7.1 Authentication1 / Authentication2 (DES)
7.2 Authentication1 v2 / Authentication2 v2 (AES)
7.3 セキュアRead/Writeコマンドフォーマット
7.4 DES発行系セキュアコマンドフォーマット

Chapter 1
はじめに

FeliCaは、交通系ICカードを筆頭に多くのSF(ストアードフェア)型電子マネーや身分証明書等に使用されている一方、その仕様において最も重要な暗号に関する仕様は非公開とされており、広く知られていません。暗号に関するセキュリティは、公にされ広く専門家が検証してこそ安全性が担保されるものです。このため、本文書ではFeliCaの隠された仕様を明らかにします。本文書は、JIS X 6319-4[4]、FeliCaカード ユーザーズマニュアル 抜粋版(以下、U-MAN)[3]、felica-tool[2]およびProxmark3[1]を大いに参考にしています。より詳しい情報を知りたい方はこれらも併せてご確認ください。

Chapter 2
FeliCaとは

FeliCaは、ソニー株式会社が開発した非接触型ICカード技術の一つで、NFC Type-Fとも呼ばれます。市場にある実装としてはFeliCa StandardとFeliCa Lite-Sがあります。本文書では、前者を取り扱います。

Chapter 3
通信プロトコル

カードとカードリーダとの間の通信プロトコルを説明します。ただし、すべてが公になっている物理層およびデータリンク層の説明は割愛し、アプリケーション層のみを取り扱います。

3.1 コマンドパケット

コマンドパケットのデータ構造を以下に示します。(表3.1)

Table 3.1: コマンドパケットのデータ構造
オフセット 長さ 項目
0x00 0x01 コマンドコード
0x01 可変 コマンドデータ

3.1.1 コマンドコード

コマンドの種類を識別するための1バイトの値です。

3.1.2 コマンドデータ

コマンドの処理指示を規定するデータで、コマンドごとに形式が異なります。

3.2 レスポンスパケット

レスポンスパケットのデータ構造を以下に示します。(表3.2)

Table 3.2: レスポンスパケットのデータ構造
オフセット 長さ 項目
0x00 0x01 レスポンスコード
0x01 可変 レスポンスデータ

3.2.1 レスポンスコード

レスポンスの種類を識別するための8ビットの値です。

3.2.2 レスポンスデータ

レスポンスの処理結果を規定するデータで、コマンドごとに形式が異なります。

3.3 コマンド一覧

各コマンドの概要ならびにコマンドコードおよびレスポンスコードを以下に示します。(表3.3)ただし、表中ではコマンドコードをCC、レスポンスコードをRCと表記します。また、まだ知られていないコマンドが存在している可能性があります。

次ページに続く

Table 3.3: コマンド一覧 (続き)

次ページに続く

Table 3.3: コマンド一覧 (続き)

Table 3.3: コマンド一覧
名称 CC RC 概要
Polling 0x00 0x01 カードリーダがカードを捕捉および特定する
Request Service 0x02 0x03 エリアやサービスの存在確認と鍵バージョンを取得する
Request Response 0x04 0x05 カードの存在とモードを確認する
Read Without
Encryption
0x06 0x07 サービス属性が認証不要のサービスからブロックデータを読み出す
Write Without
Encryption
0x08 0x09 サービス属性が認証不要のサービスへブロックデータを書き込む
Search Service Code 0x0A 0x0B エリアコードとサービスコードを取得する
Request System Code 0x0C 0x0D カード内に登録されているシステムコードを取得する
Request Block
Information
0x0E 0x0F 指定したノードに割り当てられているブロック数を取得する
Authentication1 0x10 0x11 カードリーダがカードをDES暗号方式で認証する
Authentication2 0x12 0x13 カードがカードリーダをDES暗号方式で認証する
Read 0x14 0x15 サービス属性が認証必要のサービスからDES暗号方式でブロックデータを読み出す
Write 0x16 0x17 サービス属性が認証必要のサービスへDES暗号方式でブロックデータを書き込む
Request Code List 0x1A 0x1B 指定した親ノードに対するノードのリストを反復的に取得する
Request Block
Information Ex
0x1E 0x1F 指定したノードに割り当てられているブロック数と空きブロック数を取得する
Set Parameter 0x20 0x21 カード通信パラメータを設定する(暗号化方式およびノードコードサイズ)
Get Container
Issue Information
0x22 0x23 コンテナの情報(フォーマットバージョンや携帯電話のモデルなど)を取得する
Get Area
Information
0x24 0x25 指定したエリアに関する情報を取得する
Get Node Property 0x28 0x29 ノードプロパティを取得する
Get Container
Property
0x2E 0x2F コンテナプロパティを取得する
Request Service v2 0x32 0x33 エリアやサービスの存在確認と鍵バージョンを取得する(AES暗号方式対応)
Internal Authenticate
and Read
0x34 0x35 MACつき通信有効サービスに対して内部認証を行いブロックデータを読み出す
External Authenticate
and Write
0x36 0x37 MACつき通信有効サービスに対して外部認証を行いブロックデータを書き込む
Get System Status 0x38 0x39 システムごとの設定状態を取得する
Request Product
Information
0x3A 0x3B 製品情報を取得する
Request
Specification
Version
0x3C 0x3D カードOSのバージョンを取得する
Reset Mode 0x3E 0x3F モードをMode0にリセットする
Authentication1 v2 0x40 0x41 カードリーダがカードをAES暗号方式で認証する
Authentication2 v2 0x42 0x43 カードがカードリーダをAES暗号方式で認証する
Read v2 0x44 0x45 サービス属性が認証必要のサービスからAES暗号方式でブロックデータを読み出す
Write v2 0x46 0x47 サービス属性が認証必要のサービスへAES暗号方式でブロックデータを書き込む
Delete Key 0x48 0x49 AES鍵とDES鍵が設定されているノードに対して、DES鍵の使用を停止する
Update Random ID 0x4C 0x4D 乱数化 ID(IDr)を更新する
Get Container ID 0x70 0x71 モバイルFeliCaからコンテナIDを取得する
Set Node Property 0x78 0x79 ノードプロパティを設定する
Register Issue ID 0x80 0x81 システムを初期化し発行IDを登録する
Register Area 0x82 0x83 エリアを登録する
Register Service 0x84 0x85 サービスを登録する
Register Issue ID Ex 0x86 0x87 システムを初期化し発行IDを登録する
Change System Block 0x8E 0x8F 発行系コマンドの結果を確定する

3.4 製造IDおよび製造パラメーター

Pollingコマンドのレスポンスデータとして取得できる製造ID(IDm)および製造パラメータ(PMm)を説明します。

3.4.1 IDm

IDmは、カードリーダがカードを識別するためのIDです。カード内に複数のシステムが存在する場合、システムごとにIDmが異なります。

IDmのデータ構造を以下に示します。(表3.4)ただし、製造者コードの先頭1バイトの上位4ビットはカード内でのシステム番号を示します。

Table 3.4: IDmのデータ構造
オフセット 長さ 項目
0x00 0x02 製造者コード
0x02 0x06 カード識別番号

3.4.2 PMm

PMmのデータ構造を以下に示します。(表3.5)ただし、ROM種別およびIC種別を合わせてICコードといいます。

Table 3.5: PMmのデータ構造
オフセット 長さ 項目
0x00 0x01 ROM種別
0x01 0x01 IC種別
0x02 0x06 最大応答時間パラメータ

Chapter 4
ファイルシステム

FeliCaの内部は、システム・エリア・サービス・ブロックという階層構造になっています。システムはエリアを内包し、エリアは子エリアまたはサービスを内包し、サービスはブロックを内包します。いずれも1枚のカードに複数存在することができます。このうち、システム・エリア・サービスはディレクトリのようなメタデータで、ブロックは実際のデータを格納する領域です。これらをまとめてノードと呼びます。ノードにはそれぞれを表すコードがあります。いずれのノードの存在もブロックを消費します。

4.1 システム

システムは、論理的なカードの単位であり、階層構造の最上位にあります。システム(ノード)を表すコードは0xFFFFです。システムには、以下のシステム定義情報が定義されています。

4.1.1 システムコード

システムコードは2バイトの値です。紛らわしいですが、システム(ノード)を表すコードとシステムコードは異なる概念です。システムコードには、例えば以下のようなものがあります。(表4.1)

Table 4.1: システムコードの例
システムコード 名称
0x0003 鉄道サイバネティクス領域
0x80CD フリー領域
0xFE00 共通領域
0xFE0F 管理領域

4.1.2 発行ID情報

発行ID情報は、各8バイトの発行ID(IDi)と発行パラメータ(PMi)からなります。これは、Authentication2コマンドまたはAuthentication2 v2コマンドで相互認証を成功させるとレスポンスデータから得ることができます。IDiを特定のアルゴリズムで文字列に変換すると、鉄道サイバネティクス規格の交通系ICカードの裏面右下に記載されているID番号になります。

4.1.3 システム鍵

システム鍵は、DES暗号方式では8バイトの値です。AES暗号方式の場合は16バイトの値です。

4.1.4 システム鍵バージョン

システム鍵バージョンは2バイトの値です。

4.1.5 システムプロパティ

詳細不明です。

4.1.6 システム切り替え

カードが、Pollingコマンドを受信したり、現在操作されているシステムのものとは異なるIDm宛のコマンドパケットを受信したりした場合、現在操作されているシステムが切り替わりMode0にリセットされます。ただし、Authentication1、Authentication1 v2または Internal Authenticate and Readコマンドが成功し、システム切り替えが発生した場合にはMode1になります。

4.2 エリア

エリアは、システムまたは少なくとも1つの親エリアに内包されます。エリアには、以下のエリア定義情報が定義されています。

4.2.1 エリアコード

エリアコードは2バイトの値です。第6ビットから第15ビットがエリア番号、第0ビットから第5ビットがエリア属性(表4.2)を示します。エリアコードはカード内におけるエリアの論理的な始点をも示します。

Table 4.2: エリア属性
エリア属性
子エリア作成可能エリア 0b000000
子エリア作成不可能エリア 0b000001

4.2.2 エンドサービスコード

カード内におけるエリアの論理的な終点です。

4.2.3 割り当てブロック数

エリアに割り当てられているブロックの数です。

4.2.4 エリア鍵

エリア鍵は、DES暗号方式では8バイトの値です。AES暗号方式の場合は16バイトの値です。

4.2.5 エリア鍵バージョン

エリア鍵バージョンは2バイトの値です。

4.2.6 エリアプロパティ

詳細不明です。

4.2.7 エリア0

システムには、必ず領域が0x0000から0xFFFEまでのエリア0が含まれます。

4.3 サービス

サービスは、少なくとも1つのエリアに内包されます。サービスには、以下のサービス定義情報が定義されています。

4.3.1 サービスコード

サービスコードは2バイトの値です。第6ビットから第15ビットがサービス番号、第0ビットから第5ビットがサービス属性(表4.3)を示します。サービスコードはカード内におけるサービスの論理的な位置をも示します。

Table 4.3: サービス属性
サービス属性 アクセス制御
ランダムサービス リード/ライトアクセス:認証必要 0b001000
リード/ライトアクセス:認証不要 0b001001
リードオンリーアクセス:認証必要 0b001010
リードオンリーアクセス:認証不要 0b001011
サイクリックサービス リード/ライトアクセス:認証必要 0b001100
リード/ライトアクセス:認証不要 0b001101
リードオンリーアクセス:認証必要 0b001110
リードオンリーアクセス:認証不要 0b001111
パースサービス ダイレクトアクセス:認証必要 0b010000
ダイレクトアクセス:認証不要 0b010001
キャッシュバック/
デクリメントアクセス:認証必要
0b010010
キャッシュバック/
デクリメントアクセス:認証不要
0b010011
デクリメントアクセス:認証必要 0b010100
デクリメントアクセス:認証不要 0b010101
リードオンリーアクセス:認証必要 0b010110
リードオンリーアクセス:認証不要 0b010111

4.3.2 割り当てブロック数

サービスに割り当てられているブロックの数です。

4.3.3 サービス鍵

サービス鍵は、DES暗号方式では8バイトの値です。AES暗号方式の場合は16バイトの値です。

4.3.4 サービス鍵バージョン

サービス鍵バージョンは2バイトの値です。

4.3.5 サービスプロパティ

リミットパースサービスオプションまたはMACつき通信オプションが搭載された製品でのみ設定されます。

4.3.6 オーバーラップサービス

複数のサービスコードで同じブロック群を管理することをオーバーラップするといい、同一システム内で同一サービス番号をもつサービスをオーバーラップしたサービスをオーバーラップサービスといいます。U-MAN[3]の「オーバーラップサービス」の節にある、オーバーラップの例を示した図が理解を助けます。

4.4 ブロック

ブロックはカード内の不揮発性メモリにおけるデータの実体を16バイト単位に分割したものです。メタデータを格納する以外のブロックはサービスごとに一定数が割り当てられ、サービスを内包するエリアがその割り当て総数を管理します。U-MAN[3]の「エリア」の節にある、エリアによるブロック数管理を示した図が理解を助けます。

Chapter 5
モード

カードには、Mode0からMode3までの状態(モード)が存在します。カードで実行できるコマンドは、これにより制限されています。電源断の状態から電源が供給されると、Mode0になります。Mode1以上にはDES暗号方式、AES暗号方式またはMACつき通信方式の区分があり、それぞれAuthentication1、Authentication1 v2またはInternal Authenticate and Readコマンドを実行するとMode1に遷移します。

DES暗号方式およびAES暗号方式では、Mode1においてAuthentication2またはAuthentication2 v2コマンドを実行すると該当方式のMode2に遷移します。Mode2では、相互認証が必要なコマンド群(Read, Write, Read v2, Write v2等)を実行できます。発行系コマンドを実行すると、該当方式のMode3に遷移します。

一方、MACつき通信方式にはMode2およびMode3が存在しません。Mode1で実行できるのはExternal Authenticate and Writeコマンドであり、これを実行するとMode0に戻ります。

Mode0以外に遷移すると、カードはPollingコマンドを受け付けなくなります。ただし、システム切り替えのために別システムを指定したPollingコマンドは、いずれのモードでも実行できます。また、いずれのモードにおいてもReset ModeコマンドによりMode0に遷移します。現在のモードは、Request Responseコマンドで確認できます。より詳細な情報は、U-MAN[3]の「モード」の節を参照してください。

Chapter 6
コマンド

コマンドに与えるパラメータとコマンドの詳細について述べます。ただし、コマンドの詳細は、ページ数の都合で一部コマンドを省略します。

6.1 ブロックリスト及びブロックリストエレメント

ブロックリストは、アクセス対象となるサービスおよびブロック番号を特定するための、ブロックリストエレメントの集合です。ブロックリストエレメントには、長さが2バイトのもの(表6.1)と3バイトのもの(表6.2)があります。ただし、表中のオフセットおよび長さはビット単位です。

Table 6.1: ブロックリストエレメント(2バイト)のデータ構造
オフセット 長さ 項目
0 1 長さフラグ(0b1)
1 3 アクセスモード
4 4 サービスコードリスト順番
8 8 ブロック番号・鍵バージョン
Table 6.2: ブロックリストエレメント(3バイト)のデータ構造
オフセット 長さ 項目
0 1 長さフラグ(0b0)
1 3 アクセスモード
4 4 サービスコードリスト順番
8 16 ブロック番号・鍵バージョン(リトルエンディアン)

6.1.1 アクセスモード

ブロックリストエレメントが対象とするノードへのアクセス方法を指定します。(表6.3)

Table 6.3: アクセスモード
アクセスモード
パースサービスへのキャッシュバックアクセス以外 0b000
パースサービスへのキャッシュバックアクセス 0b001
鍵変更 0b100

6.2 Polling

Pollingコマンドは、カードリーダがカードを捕捉および特定するためのコマンドです。指定したシステムコードを持つシステムのIDmおよびPMmが取得できます。

6.2.1 コマンドパケットのデータ構造

Pollingコマンドパケットのデータ構造を以下に示します。(表6.4)

Table 6.4: Pollingコマンドパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 コマンドコード 0x00
0x01 0x02 システムコード (x) 0x0000 x 0xFFFF (ただし、各バイト0xFFはワイルドカード。) ビッグエンディアン
0x03 0x01 リクエストコード 0x00: 要求なし、0x01: システムコード要求、0x02: 通信性能要求
0x04 0x01 応答可能な最大スロット数の指定 0x00, 0x01, 0x03, 0x07, 0x0F (詳細はU-MAN[3]の「Polling」の節にある、タイムスロット規定の表を参照)

6.2.2 レスポンスパケットのデータ構造

Pollingレスポンスパケットのデータ構造を以下に示します。(表6.5)

Table 6.5: Pollingレスポンスパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 レスポンスコード 0x01
0x01 0x08 IDm -
0x09 0x08 PMm -
0x11 0x02 リクエストデータ コマンドにおけるリクエストコードが0x00以外であり、かつ製品が対応するリクエストコードが指定された場合のみ返送

対応していないリクエストコードを指定した場合、レスポンスパケットにリクエストデータは付加されません。リクエストコードを指定してもリクエストデータが返送されない場合があることを前提に実装してください。

6.3 Request Service

Request Serviceコマンドは、エリアやサービスの存在確認と鍵バージョンを取得するためのコマンドです。

6.3.1 コマンドパケットのデータ構造

Request Serviceコマンドパケットのデータ構造を以下に示します。(表6.6)

Table 6.6: Request Serviceコマンドパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 コマンドコード 0x02
0x01 0x08 IDm -
0x09 0x01 ノード数 (n) 0x01 n 0x20
0x0A 2n ノードコードリスト リトルエンディアン

6.3.2 レスポンスパケットのデータ構造

Request Serviceレスポンスパケットのデータ構造を以下に示します。(表6.7)

Table 6.7: Request Serviceレスポンスパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 レスポンスコード 0x03
0x01 0x08 IDm -
0x09 0x01 ノード数 (n) 0x01 n 0x20
0x0A 2n ノード鍵バージョンリスト ただし、ノードが存在しない場合には0xFFFF。リトルエンディアン

6.4 Request Response

Request Responseコマンドは、カードの存在とモードを確認するためのコマンドです。

6.4.1 コマンドパケットのデータ構造

Request Responseコマンドパケットのデータ構造を以下に示します。(表6.8)

Table 6.8: Request Responseコマンドパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 コマンドコード 0x04
0x01 0x08 IDm -

6.4.2 レスポンスパケットのデータ構造

Request Responseレスポンスパケットのデータ構造を以下に示します。(表6.9)

Table 6.9: Request Responseレスポンスパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 レスポンスコード 0x05
0x01 0x08 IDm -
0x09 0x01 モード (n) 0x00 n 0x03

6.5 Read Without Encryption

Read Without Encryptionコマンドは、サービス属性が認証不要のサービスからブロックデータを読み出すためのコマンドです。

6.5.1 コマンドパケットのデータ構造

Read Without Encryptionコマンドパケットのデータ構造を以下に示します。(表6.10)

Table 6.10: Read Without Encryptionコマンドパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 コマンドコード 0x06
0x01 0x08 IDm -
0x09 0x01 サービス数 (m) 0x01 m 0x10
0x0A 2m サービスコードリスト リトルエンディアン
- 0x01 ブロック数 (n) 0x01 n 製品の最大読み出し可能ブロック数
- 2n N 3n ブロックリスト -

6.5.2 レスポンスパケットのデータ構造

Read Without Encryptionレスポンスパケットのデータ構造を以下に示します。(表6.11)

Table 6.11: Read Without Encryptionレスポンスパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 レスポンスコード 0x07
0x01 0x08 IDm -
0x09 0x01 ステータスフラグ1 0x00: 正常
0x0A 0x01 ステータスフラグ2 0x00: 正常
0x0B 0x01 ブロック数 (n) 0x01 n 製品の最大同時読み出し可能ブロック数
0x0C 16n ブロックデータ -

6.6 Write Without Encryption

Write Without Encryptionコマンドは、サービス属性が認証不要のサービスにブロックデータを書き込むためのコマンドです。

6.6.1 コマンドパケットのデータ構造

Write Without Encryptionコマンドパケットのデータ構造を以下に示します。(表6.12)

Table 6.12: Write Without Encryptionコマンドパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 コマンドコード 0x08
0x01 0x08 IDm -
0x09 0x01 サービス数 (m) 0x01 m 0x10
0x0A 2m サービスコードリスト リトルエンディアン
- 0x01 ブロック数 (n) 0x01 n 製品の最大同時書き込み可能ブロック数
- 2n N 3n ブロックリスト -
- 16n ブロックデータ -

6.6.2 レスポンスパケットのデータ構造

Write Without Encryptionレスポンスパケットのデータ構造を以下に示します。(表6.13)

Table 6.13: Write Without Encryptionレスポンスパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 レスポンスコード 0x09
0x01 0x08 IDm -
0x09 0x01 ステータスフラグ1 0x00: 正常
0x0A 0x01 ステータスフラグ2 0x00: 正常

6.7 Search Service Code

Search Service Codeコマンドは、エリアコードとサービスコードを取得するためのコマンドです。

6.7.1 コマンドパケットのデータ構造

Search Service Codeコマンドパケットのデータ構造を以下に示します。(表6.14)

Table 6.14: Search Service Codeコマンドパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 コマンドコード 0x0A
0x01 0x08 IDm -
0x09 0x02 ノードインデックス 0x0000 n 0xFFFF リトルエンディアン

6.7.2 レスポンスパケットのデータ構造

Search Service Codeレスポンスパケットのデータ構造を以下に示します。(表6.15)

Table 6.15: Search Service Codeレスポンスパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 レスポンスコード 0x0B
0x01 0x08 IDm -
0x09 0x02または0x04 ノードコード 2バイト: サービスコード、4バイト: エリアコードおよびエリアエンドサービスコード。
いずれもリトルエンディアン。0xFFFFの場合は該当するノードが存在しないことを示す

ノードインデックスを0から順に増やしながら本コマンドを実行し、レスポンスのノードコードが0xFFFFとなった時点を終端として、カード内のノードを走査できます。

6.8 Request System Code

Request System Codeコマンドは、カード内に登録されているシステムコードを取得するためのコマンドです。

6.8.1 コマンドパケットのデータ構造

Request System Codeコマンドパケットのデータ構造を以下に示します。(表6.16)

Table 6.16: Request System Codeコマンドパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 コマンドコード 0x0C
0x01 0x08 IDm -

6.8.2 レスポンスパケットのデータ構造

Request System Codeレスポンスパケットのデータ構造を以下に示します。(表6.17)

Table 6.17: Request System Codeレスポンスパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 レスポンスコード 0x0D
0x01 0x08 IDm -
0x09 0x01 システムコード数 (n) -
0x0A 2n システムコードリスト システム0から順に列挙。ビッグエンディアン。

6.9 Request Block Information

Request Block Informationコマンドは、指定したノードに割り当てられているブロック数を取得するためのコマンドです。モバイルFeliCaのみ対応しています。

6.9.1 コマンドパケットのデータ構造

Request Block Informationコマンドパケットのデータ構造を以下に示します。(表6.18)

Table 6.18: Request Block Informationコマンドパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 コマンドコード 0x0E
0x01 0x08 IDm -
0x09 0x01 ノードコード数 (n) -
0x0A 2n ノードコードリスト リトルエンディアン

6.9.2 レスポンスパケットのデータ構造

Request Block Informationレスポンスパケットのデータ構造を以下に示します。(表6.19)

Table 6.19: Request Block Informationレスポンスパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 レスポンスコード 0x0F
0x01 0x08 IDm -
0x09 0x01 ブロック情報数 (n) -
0x0A 2n ブロック情報リスト 各ノードに割り当てられているブロック数を示す

6.10 Authentication1

Authentication1コマンドは、DES方式でカード側認証チャレンジを開始するためのコマンドです。

6.10.1 コマンドパケットのデータ構造

Authentication1コマンドパケットのデータ構造は、表7.1を参照してください。

6.10.2 レスポンスパケットのデータ構造

Authentication1レスポンスパケットのデータ構造は、表7.3を参照してください。

6.11 Authentication2

Authentication2コマンドは、DES方式の相互認証を完了するためのコマンドです。

6.11.1 コマンドパケットのデータ構造

Authentication2コマンドパケットのデータ構造は、表7.2を参照してください。

6.11.2 レスポンスパケットのデータ構造

Authentication2レスポンスパケットのデータ構造は、表7.4を参照してください。

6.12 Read

Readコマンドは、相互認証後のDESセッションでブロックデータを読み出すためのコマンドです。

6.12.1 コマンドパケットのデータ構造

Readコマンドの暗号化前内部ペイロード構造は、表7.12を参照してください。

6.12.2 レスポンスパケットのデータ構造

Readレスポンスの暗号化前内部ペイロード構造は、表7.13を参照してください。

6.13 Write

Writeコマンドは、相互認証後のDESセッションでブロックデータを書き込むためのコマンドです。

6.13.1 コマンドパケットのデータ構造

Writeコマンドの暗号化前内部ペイロード構造は、表7.14を参照してください。 アクセスモード0b100(鍵変更)のブロックデータに格納する鍵変更パッケージは、表7.16および同節の生成アルゴリズムを参照してください。

6.13.2 レスポンスパケットのデータ構造

Writeレスポンスの暗号化前内部ペイロード構造は、表7.15を参照してください。

6.14 Get Node Property

Get Node Propertyコマンドは、ノードプロパティを取得するためのコマンドです。リミットパースサービスオプションまたはMACつき通信オプションのノードプロパティが取得できます。本コマンドは、一部のAESカード製品およびAES/DESカード製品にのみ搭載されています。

6.14.1 コマンドパケットのデータ構造

Get Node Propertyコマンドパケットのデータ構造を以下に示します。(表6.20)

Table 6.20: Get Node Propertyコマンドパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 コマンドコード 0x28
0x01 0x08 IDm -
0x09 0x01 取得対象 0x00: リミットパースサービス、0x01: MACつき通信有効サービス
0x0A 0x01 ノード数 (n) 0x01 n 0x10
0x0B 2n ノードコードリスト リトルエンディアン

6.14.2 レスポンスパケットのデータ構造

Get Node Propertyレスポンスパケットのデータ構造を以下に示します。(表6.21)

Table 6.21: Get Node Propertyレスポンスパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 レスポンスコード 0x29
0x01 0x08 IDm -
0x09 0x01 ステータスフラグ1 0x00: 正常
0x0A 0x01 ステータスフラグ2 0x00: 正常
0x0B 0x01 ノード数 (n) ステータスフラグ1が0x00の場合のみ返送
0x0C mn ノードプロパティ ステータスフラグ1が0x00の場合のみ返送。ノードコードリストの順に列挙される。
取得対象が0x00のときm=10、0x01のときm=1

取得対象に0x00(リミットパースサービス)を指定した場合のノードプロパティのデータ構造を以下に示します。(表6.22)

Table 6.22: リミットパースサービスのノードプロパティのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 リミットパースサービス有効フラグ 0x01: 有効、0x00: 無効
0x01 0x04 上限値 リトルエンディアン、2の補数表現。無効の場合は全バイトが0xFF
0x05 0x04 下限値 リトルエンディアン、2の補数表現。無効の場合は全バイトが0xFF
0x09 0x01 世代番号 無効の場合は0xFF

取得対象に0x01(MACつき通信有効サービス)を指定した場合のノードプロパティは、MACつき通信有効フラグ1バイトのみです。値は0x01が有効、0x00が無効を表します。

6.15 Request Service v2

Request Service v2コマンドは、暗号方式識別子と鍵バージョン情報を取得するためのコマンドです。

6.15.1 コマンドパケットのデータ構造

Request Service v2コマンドパケットのデータ構造を以下に示します。(表6.23)

Table 6.23: Request Service v2コマンドパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 コマンドコード 0x32
0x01 0x08 IDm -
0x09 0x01 ノード数 (n) 0x01 n 0x20
0x0A 2n ノードコードリスト リトルエンディアン

6.15.2 レスポンスパケットのデータ構造

Request Service v2レスポンスパケットのデータ構造を以下に示します。(表6.24)

Table 6.24: Request Service v2レスポンスパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 レスポンスコード 0x33
0x01 0x08 IDm -
0x09 0x01 ステータスフラグ1 0x00: 正常
0x0A 0x01 ステータスフラグ2 0x00: 正常
0x0B 0x01 暗号方式識別子 ステータスフラグ1が0x00の場合のみ返送
0x0C 0x01 ノード数 (n) ステータスフラグ1が0x00の場合のみ返送。0x01 n 0x20
0x0D 2nまたは4n 鍵バージョンリスト ステータスフラグ1が0x00の場合のみ返送。
暗号方式識別子が0x41または0x43のときは4nバイト(前半AES, 後半DES)。
それ以外は2nバイト

6.16 Get System Status

Get System Statusコマンドは、システムごとの設定状態を取得するためのコマンドです。

6.16.1 コマンドパケットのデータ構造

Get System Statusコマンドパケットのデータ構造を以下に示します。(表6.25)

Table 6.25: Get System Statusコマンドパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 コマンドコード 0x38
0x01 0x08 IDm -
0x09 0x02 予約領域 0x0000

6.16.2 レスポンスパケットのデータ構造

Get System Statusレスポンスパケットのデータ構造を以下に示します。(表6.26)

Table 6.26: Get System Statusレスポンスパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 レスポンスコード 0x39
0x01 0x08 IDm -
0x09 0x01 ステータスフラグ1 0x00: 正常
0x0A 0x01 ステータスフラグ2 0x00: 正常
0x0B 0x01 フラグ 詳細不明
0x0C 0x01 データ長 (n) -
0x0D n データ 詳細不明

フラグおよびデータの意味は詳細不明です。

6.17 Request Specification Version

Request Specification Versionコマンドは、カードOSのバージョンを取得するためのコマンドです。

6.17.1 コマンドパケットのデータ構造

Request Specification Versionコマンドパケットのデータ構造を以下に示します。(表6.27)

Table 6.27: Request Specification Versionコマンドパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 コマンドコード 0x3C
0x01 0x08 IDm -
0x09 0x02 予約領域 0x0000

6.17.2 レスポンスパケットのデータ構造

Request Specification Versionレスポンスパケットのデータ構造を以下に示します。(表6.28)

Table 6.28: Request Specification Versionレスポンスパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 レスポンスコード 0x3D
0x01 0x08 IDm -
0x09 0x01 ステータスフラグ1 0x00: 正常
0x0A 0x01 ステータスフラグ2 0x00: 正常
0x0B 0x01 フォーマットバージョン 0x00固定。ステータスフラグ1が0x00の場合のみ返送
0x0C 0x02 基本バージョン ステータスフラグ1が0x00の場合のみ返送。リトルエンディアン
0x0E 0x01 オプション数 (m) ステータスフラグ1が0x00の場合のみ返送
0x0F 2m オプションバージョンリスト ステータスフラグ1が0x00の場合のみ返送。リトルエンディアン

オプションバージョンリストの各要素の割り当てを以下に示します。(表6.29)

次ページに続く

Table 6.29: オプションバージョンリストの割り当て (続き)

Table 6.29: オプションバージョンリストの割り当て
位置 オプション
D0-D1 DESオプション
D2-D3 0x00, 0x00 (モバイルFeliCaでは固有のバージョンが設定されている場合がある)
D4-D5 拡張オーバーラップオプション
D6-D7 リミットパースサービスオプション
D8-D9 MACつき通信オプション
D10-D11 乱数化IDオプション

基本バージョンおよび各オプションバージョンは、いずれも2バイトのデータです。上位4ビットは0b1000固定であり、残りの12ビットがBCD形式のバージョン値を表します。例えば、バージョン5.0.0は0x500となります。オプションの有無およびバージョンの値は製品ごとに異なります。

6.18 Reset Mode

Reset Modeコマンドは、モードをMode0にリセットするためのコマンドです。

6.18.1 コマンドパケットのデータ構造

Reset Modeコマンドパケットのデータ構造を以下に示します。(表6.30)

Table 6.30: Reset Modeコマンドパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 コマンドコード 0x3E
0x01 0x08 IDm -
0x09 0x02 予約領域 0x0000

6.18.2 レスポンスパケットのデータ構造

Reset Modeレスポンスパケットのデータ構造を以下に示します。(表6.31)

Table 6.31: Reset Modeレスポンスパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 レスポンスコード 0x3F
0x01 0x08 IDm -
0x09 0x01 ステータスフラグ1 0x00: 正常
0x0A 0x01 ステータスフラグ2 0x00: 正常

6.19 Authentication1 v2

Authentication1 v2コマンドは、AES方式でカード側認証チャレンジを開始するためのコマンドです。

6.19.1 コマンドパケットのデータ構造

Authentication1 v2コマンドパケットのデータ構造は、表7.6を参照してください。

6.19.2 レスポンスパケットのデータ構造

Authentication1 v2レスポンスパケットのデータ構造は、表7.8を参照してください。

6.20 Authentication2 v2

Authentication2 v2コマンドは、AES方式の相互認証を完了するためのコマンドです。

6.20.1 コマンドパケットのデータ構造

Authentication2 v2コマンドパケットのデータ構造は、表7.7を参照してください。

6.20.2 レスポンスパケットのデータ構造

Authentication2 v2レスポンスパケットのデータ構造は、表7.9を参照してください。

6.21 Read v2

Read v2コマンドは、相互認証後のAESセッションでブロックデータを読み出すためのコマンドです。

6.21.1 コマンドパケットのデータ構造

Read v2コマンドの暗号化前内部ペイロード構造は、表7.12を参照してください。

6.21.2 レスポンスパケットのデータ構造

Read v2レスポンスの暗号化前内部ペイロード構造は、表7.13を参照してください。

6.22 Write v2

Write v2コマンドは、相互認証後のAESセッションでブロックデータを書き込むためのコマンドです。

6.22.1 コマンドパケットのデータ構造

Write v2コマンドの暗号化前内部ペイロード構造は、表7.14を参照してください。 鍵変更(アクセスモード0b100)はWrite v2では有効ではありません。

6.22.2 レスポンスパケットのデータ構造

Write v2レスポンスの暗号化前内部ペイロード構造は、表7.15を参照してください。

6.23 Register Issue ID

Register Issue IDコマンドは、発行ID関連情報を登録するための発行系セキュアコマンドです。

6.23.1 コマンドパケットのデータ構造

Register Issue IDコマンドの暗号化前内部ペイロード構造は、表7.17を参照してください。

6.23.2 レスポンスパケットのデータ構造

Register Issue IDレスポンスの暗号化前内部ペイロードは、ステータスフラグ1/2に加え、成功時のみ残りブロック数(2バイト)を返します。

6.24 Register Area

Register Areaコマンドは、エリアを登録するための発行系セキュアコマンドです。

6.24.1 コマンドパケットのデータ構造

Register Areaコマンドの暗号化前内部ペイロード構造は、表7.18を参照してください。

6.24.2 レスポンスパケットのデータ構造

Register Areaレスポンスの暗号化前内部ペイロードは、ステータスフラグ1/2の2バイトです。

6.25 Register Service

Register Serviceコマンドは、サービスを登録するための発行系セキュアコマンドです。

6.25.1 コマンドパケットのデータ構造

Register Serviceコマンドの暗号化前内部ペイロード構造は、表7.19を参照してください。

6.25.2 レスポンスパケットのデータ構造

Register Serviceレスポンスの暗号化前内部ペイロードは、ステータスフラグ1/2に加え、成功時のみ残りブロック数(2バイト)を返します。

6.26 Change System Block

Change System Blockコマンドは、発行系コマンドの結果を確定するための発行系セキュアコマンドです。

6.26.1 コマンドパケットのデータ構造

Change System Blockコマンドの暗号化前内部ペイロード構造は、表7.20を参照してください。

6.26.2 レスポンスパケットのデータ構造

Change System Blockレスポンスの暗号化前内部ペイロードは、ステータスフラグ1/2の2バイトです。

6.27 ステータスフラグ

ステータスフラグは、コマンド処理の結果を表す値で、ステータスフラグ1とステータスフラグ2からなります。

6.27.1 ステータスフラグ1

ステータスフラグ1は、コマンド処理の成否やエラーが発生したブロック位置またはサービス位置を示します。(表6.32)

Table 6.32: ステータスフラグ1の値と意味
意味
0x00 正常終了
0xFF コマンドパケットにリストを含まないコマンドでのエラーまたはリストに依存しないエラー
上記以外 エラーが発生したリスト上の位置

エラーが発生した位置の表現形式は製品によって2種類あり、いずれであるかはステータスフラグ1の値だけでは判別できません。(表6.33)例えば、ブロックリストの10番目に指定したノードでエラーが発生した場合、順番形式では0x0Aを、ビットマップ形式では0x02を返します。

次ページに続く

Table 6.33: ステータスフラグ1におけるエラー位置の表現形式 (続き)

Table 6.33: ステータスフラグ1におけるエラー位置の表現形式
形式 内容
順番形式 エラーが発生したブロックリストまたはサービスコードリスト上の位置(1始まり)をそのまま設定する
ビットマップ形式 各ビットがリスト上の位置に対応し、1がエラーあり、0がエラーなしを表す。ビット0が1番目または9番目、ビット1が2番目または10番目、以下同様にビット6が7番目または15番目に対応し、ビット7は8番目に対応する

6.27.2 ステータスフラグ2

ステータスフラグ2は、エラーの詳細内容を示します。(表6.34)また、すべての製品で共通の仕様ではない「カード固有仕様」があります。(表6.35)

Table 6.34: ステータスフラグ2の値と意味
意味
0x00 正常終了
0x01 パースのデクリメント時に、計算結果がゼロ未満になるまたはキャッシュバック時に計算結果が4バイトを超える数になる
0x02 パースのキャッシュバック時に、指定されたデータがキャッシュバックデータの値を超えている
0x03 リミットパースサービスの書き込み時に、パースデータが上限値と下限値との間に入らない
0x70 メモリ異常(致命的エラー)
0x71 メモリ書き換え回数が上限を超えている(警告であり、書き込み処理は行われる)

0x71は警告であるため、書き込み処理自体は実行されます。書き換え回数の上限値は製品ごとに異なり、このときステータスフラグ1が0x00となる製品と0xFFとなる製品があります。

次ページに続く

Table 6.35: ステータスフラグ2の値と意味(カード固有仕様) (続き)

Table 6.35: ステータスフラグ2の値と意味(カード固有仕様)
意味
0xA1 コマンドで指定されたサービス数またはノード数が規定値の範囲外である
0xA2 コマンドで指定されたブロック数が製品規定値の範囲外である
0xA3 ブロックリストエレメントで指定されたサービスコードリスト順番が、コマンドで指定されたサービス数または相互認証時に指定したサービス数の範囲外である
0xA4 コマンドで指定されたエリアコードのエリア属性またはサービスコードのサービス属性が誤っている
0xA5 コマンドで指定されたエリアまたはサービスにアクセスできない、またはコマンドで指定されたパラメーターが成功条件を満たしていない
0xA6 ブロックリストエレメントで指定されたサービスコードリスト順番で指定されたアクセス先またはノードコードリストで指定されたノードが存在しない
0xA7 ブロックリストエレメントで指定されたアクセスモードが誤っている
0xA8 ブロックリストエレメントで指定されたブロック番号がサービスに割り当てられているブロック数を超えている
0xA9 発行コマンドにおいて書き込みに失敗した
0xAA 鍵変更に失敗した
0xAB 発行コマンドにおいてパッケージパリティまたはパッケージMACが不正である
0xAC 発行コマンドにおいてパラメーターが不正である
0xAD 登録しようとしたサービスがすでに存在している
0xAE 発行コマンドにおいてシステムコードが不正である
0xAF コマンドで指定されたサイクリックサービスへの同時書き込みブロック数がサービスに割り当てられているブロック数を超えている
0xC0 発行コマンドにおいてパッケージ識別子が不正である
0xC1 発行コマンドにおいてパッケージ内とパッケージ外のパラメータが不一致である
0xC2 発行コマンドが無効化されている
0xC3 コマンドで指定されたノードの属性が誤っている

Chapter 7
相互認証およびセキュアメッセージングアルゴリズム

7.1 Authentication1 / Authentication2 (DES)

7.1.1 コマンドパケットのデータ構造

Authentication1コマンドパケットのデータ構造を以下に示します。(表7.1)

Table 7.1: Authentication1コマンドパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 コマンドコード 0x10
0x01 0x08 IDm -
0x09 0x01 エリア数 (a) -
0x0A 2a エリアコードリスト リトルエンディアン
- 0x01 サービス数 (s) -
- 2s サービスコードリスト リトルエンディアン
- 0x08 チャレンジ1A 8バイト

Authentication2コマンドパケットのデータ構造を以下に示します。(表7.2)

Table 7.2: Authentication2コマンドパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 コマンドコード 0x12
0x01 0x08 IDm -
0x09 0x08 チャレンジ2B 8バイト

7.1.2 レスポンスパケットのデータ構造

Authentication1レスポンスパケットのデータ構造を以下に示します。(表7.3)

Table 7.3: Authentication1レスポンスパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 レスポンスコード 0x11
0x01 0x08 IDm -
0x09 0x08 チャレンジ1B 8バイト
0x11 0x08 チャレンジ2A 8バイト

Authentication2レスポンスパケットのデータ構造を以下に示します。(表7.4)本レスポンスはIDmを含まず、レスポンスコードに続く部分の全体が暗号化されています。

Table 7.4: Authentication2レスポンスパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 レスポンスコード 0x13
0x01 0x20 暗号化ペイロード 乱数R2を鍵とするDES-CBC(IV=0)で暗号化されている。復号後の構造は表7.5を参照

復号後のペイロードのデータ構造を以下に示します。(表7.5)

Table 7.5: Authentication2レスポンスの復号後ペイロードのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x02 トランザクション番号 (TN) リトルエンディアン
0x02 0x06 トランザクションID (TID) 乱数R1の後半6バイトと一致する
0x08 0x08 発行ID (IDi) -
0x10 0x08 発行パラメータ (PMi) -
0x18 0x08 MAC 先行する24バイトに対して算出される

7.1.3 DES相互認証アルゴリズム

DES相互認証に用いる主要パラメータは以下で導出します。

7.2 Authentication1 v2 / Authentication2 v2 (AES)

7.2.1 コマンドパケットのデータ構造

Authentication1 v2コマンドパケットのデータ構造を以下に示します。(表7.6)

Table 7.6: Authentication1 v2コマンドパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 コマンドコード 0x40
0x01 0x08 IDm -
0x09 0x01 オペレーションパラメータ -
0x0A 0x01 ノード数 (n) -
0x0B 2n ノードコードリスト リトルエンディアン
- 0x10 チャレンジ1A 16バイト

Authentication2 v2コマンドパケットのデータ構造を以下に示します。(表7.7)

Table 7.7: Authentication2 v2コマンドパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 コマンドコード 0x42
0x01 0x08 IDm -
0x09 0x10 チャレンジ2B 16バイト

7.2.2 レスポンスパケットのデータ構造

Authentication1 v2レスポンスパケットのデータ構造を以下に示します。(表7.8)

Table 7.8: Authentication1 v2レスポンスパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 レスポンスコード 0x41
0x01 0x08 IDm -
0x09 0x10 チャレンジ1B 16バイト
0x19 0x10 チャレンジ2A 16バイト
0x29 0x04 チャレンジ3C 4バイト

Authentication2 v2レスポンスパケットのデータ構造を以下に示します。(表7.9)本レスポンスもIDmを含みません。トランザクション番号のみ平文で、ペイロードとMACが暗号化されています。

Table 7.9: Authentication2 v2レスポンスパケットのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 レスポンスコード 0x43
0x01 0x02 トランザクション番号 (TN) リトルエンディアン。暗号化されない
0x03 0x10 暗号化ペイロード AES-128-OFBで暗号化されている。復号後の構造は表7.10を参照
0x13 0x08 暗号化MAC 同じOFBストリームの後段で暗号化されている

復号後のペイロードのデータ構造を以下に示します。(表7.10)

Table 7.10: Authentication2 v2レスポンスの復号後ペイロードのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x08 発行ID (IDi) -
0x08 0x08 発行パラメータ (PMi) -

7.2.3 AES相互認証アルゴリズム

AES相互認証に用いる主要パラメータは以下で導出します。

7.3 セキュアRead/Writeコマンドフォーマット

Read, Write, Read v2, Write v2は、暗号化されたセキュアフレーム内部に同一形式の内部ペイロードを格納します。差分は暗号方式のみです。

Table 7.11: セキュアRead/Write 4コマンドの差分
コマンド 暗号方式 ペイロード構造
Read DES Read系共通(表7.12および表7.13)
Read v2 AES Read系共通(表7.12および表7.13)
Write DES Write系共通(表7.14および表7.15)
Write v2 AES Write系共通(表7.14および表7.15)
Table 7.12: Read系コマンド(Read/Read v2)内部ペイロードのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 ブロック数 (n) 0x01 n 製品の最大同時読み出し可能ブロック数
0x01 2n〜3n ブロックリスト ブロックリストエレメントの2バイト形式または3バイト形式
Table 7.13: Read系レスポンス(Read/Read v2)内部ペイロードのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 ステータスフラグ1 0x00: 正常
0x01 0x01 ステータスフラグ2 0x00: 正常
0x02 0x01 ブロック数 (n) ステータスフラグ1が0x00の場合のみ返送
0x03 16n ブロックデータ ステータスフラグ1が0x00の場合のみ返送
Table 7.14: Write系コマンド(Write/Write v2)内部ペイロードのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 ブロック数 (n) 0x01 n 製品の最大同時書き込み可能ブロック数
0x01 2n〜3n ブロックリスト ブロックリストエレメントの2バイト形式または3バイト形式
可変 16n ブロックデータ 16バイト×n
Table 7.15: Write系レスポンス(Write/Write v2)内部ペイロードのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 ステータスフラグ1 0x00: 正常
0x01 0x01 ステータスフラグ2 0x00: 正常

7.3.1 DES鍵変更パッケージの生成と使用方法

WriteコマンドでDES鍵変更を行う場合、ブロックリストエレメントのアクセスモードを0b100(鍵変更)に設定し、ブロックデータには16バイトの鍵変更パッケージを格納します。

Table 7.16: 鍵変更パッケージ(16バイト)のデータ構造
オフセット 長さ 項目 値または備考
0x00 0x08 Parameter1 新鍵バージョン情報を含む暗号ブロック
0x08 0x08 Parameter2 新鍵本体を含む暗号ブロック

親鍵をKparent、旧鍵をKold、新鍵をKnew、新鍵バージョンをvとします。まず、8バイトのバージョンブロックV

V  = 00 00 00 00 00 00 v  v
                     LE,0  LE,1

で作成し、次を計算します。

P1 = DESKparent(DESKold(DESKnew(V)))

P2 = DESKparent(DESKold(Knew))

KeyChangePackage = P1 ∥ P2

使用時は、鍵変更対象ごとに次を1組としてWriteコマンドに渡します。

複数鍵を同時に変更する場合は、ブロックリストとブロックデータの順序を一致させて並べます。失敗時はステータスフラグ2として、例えば0xAA(鍵変更失敗)や0xAB(パッケージMAC異常)が返ることがあります。

7.3.2 DESセキュアメッセージング

DESセッションでは、暗号化前ペイロードを

P = TN(2,LE) ∥ TID (6) ∥ CommandPayload

とし、任意の方式で8バイト境界へパディングしたPにMACを付与してDES-CBC(IV=0)で暗号化します。

MACは次で計算します。

M0 = [Len, Code, 0, 0, 0, 0, 0, 0]

Mi = DESBi (Mi−1)

ここでBiPの8バイトブロック列、Len = 2 + |P′| + 8です。最終値MnをMAC(8バイト)として付与します。

応答は復号後にMAC検証し、末尾8バイトのMACを除去した後にパディングを除去します。さらにTID一致とTN単調増加を検証します。

7.3.3 AES-128セキュアメッセージング

AESセッションでは、送信データを

TN (2,LE ) ∥ EncPayload ∥ EncMAC (8)

とします。PayloadそのものはOFBで暗号化し、MACも同じOFBストリームの後段で暗号化します。

初期ベクトルIV(16バイト)は次で構成します。

IV [0] = 0x01, IV [1] = FrameLen, IV [2] = Code,

IV[3..4] = TN, IV [5..10] = TID,

IV[11..13] = C3C[1..3], IV[14..15] = 0

MAC平文はAES-CMACで計算し、先頭8バイトを使用します。

B0[0] = 0x19, B0[1..13] = IV[1..13], B0[14..15] = |P ayload|BE16

M AC = CMACKmac  (B0 ∥ Payload)[0..7]

OFB暗号化時、Payload長が16の倍数でない場合は次の16バイト境界までキーストリームを消費してからMACを暗号化します。

7.4 DES発行系セキュアコマンドフォーマット

Register Issue ID, Register Area, Register Service, Change System BlockはDESセキュアコマンドとして送受信されます。暗号化前の内部ペイロード構造を以下に示します。

Table 7.17: Register Issue IDコマンド内部ペイロードのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x08 発行ID -
0x08 0x08 発行パラメータ -
0x10 可変 パッケージ DESで生成された発行パッケージ
Table 7.18: Register Areaコマンド内部ペイロードのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x02 エリアコード リトルエンディアン
0x02 可変 パッケージ DESで生成された発行パッケージ
Table 7.19: Register Serviceコマンド内部ペイロードのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x02 サービスコード リトルエンディアン
0x02 可変 パッケージ DESで生成された発行パッケージ
Table 7.20: Change System Blockコマンド内部ペイロードのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x00 なし ペイロードなし

レスポンス内部ペイロードのデータ構造を以下に示します。

Table 7.21: Register Issue IDレスポンス内部ペイロードのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 ステータスフラグ1 0x00: 正常
0x01 0x01 ステータスフラグ2 0x00: 正常
0x02 0x02 残りブロック数 ステータスフラグ1が0x00の場合のみ返送。リトルエンディアン
Table 7.22: Register Areaレスポンス内部ペイロードのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 ステータスフラグ1 0x00: 正常
0x01 0x01 ステータスフラグ2 0x00: 正常
Table 7.23: Register Serviceレスポンス内部ペイロードのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 ステータスフラグ1 0x00: 正常
0x01 0x01 ステータスフラグ2 0x00: 正常
0x02 0x02 残りブロック数 ステータスフラグ1が0x00の場合のみ返送。リトルエンディアン
Table 7.24: Change System Blockレスポンス内部ペイロードのデータ構造
オフセット 長さ 項目 値または備考
0x00 0x01 ステータスフラグ1 0x00: 正常
0x01 0x01 ステータスフラグ2 0x00: 正常

発行パッケージ平文(暗号化前)は16バイトで、各コマンドのフォーマットは以下のとおりです。

次ページに続く

Table 7.25: Register Issue ID用発行パッケージ平文(16バイト)のデータ構造 (続き)

Table 7.25: Register Issue ID用発行パッケージ平文(16バイト)のデータ構造
オフセット 長さ 項目 値または備考
0x00 0x02 システムコード ビッグエンディアン
0x02 0x02 Area0鍵バージョン リトルエンディアン
0x04 0x08 Area0鍵 -
0x0C 0x04 予約領域 0x00000000
Table 7.26: Register Area用発行パッケージ平文(16バイト)のデータ構造
オフセット 長さ 項目 値または備考
0x00 0x02 サービスコード開始 リトルエンディアン
0x02 0x02 サービスコード終端 リトルエンディアン
0x04 0x02 サイズ リトルエンディアン
0x06 0x02 鍵バージョン リトルエンディアン
0x08 0x08 エリア鍵 -
Table 7.27: Register Service用発行パッケージ平文(16バイト)のデータ構造
オフセット 長さ 項目 値または備考
0x00 0x02 サービスコード リトルエンディアン
0x02 0x02 予約領域 0x0000
0x04 0x02 サイズ リトルエンディアン
0x06 0x02 鍵バージョン リトルエンディアン
0x08 0x08 サービス鍵 -

7.4.1 発行パッケージ作成アルゴリズム

パッケージ鍵をKpkg、平文パッケージをPとします(|P|は8の倍数、かつ0でないことが条件です)。

参考文献

[1]

C. Herrmann et al. Proxmark3 – Iceman repo. https://github.com/RfidResearchGroup/proxmark3.

[2]

kormax. GitHub - kormax/felica-tool: Application for analyzing characteristics of FeliCa cards. 2025. url: https://github.com/kormax/felica-tool (visited on 05/28/2025).

[3]

ソニー株式会社. FeliCaカード ユーザーズマニュアル 抜粋版. Version 2.31. 2026. url: https://www.sony.co.jp/Products/felica/business/tech-support/data/card_usersmanual_2.31j.pdf (visited on 07/23/2026).

[4]

一般財団法人日本規格協会. JIS X 6319-4:2016 ICカード実装仕様―第4部:高速処理用近接型ICカード. 2016.