Ubuntu + Identiv Cloud 3701 FでSuicaを読み込む（下調べメモ）

# これはなに？

とりとめのないメモとリンク集です。

* Ubuntu 20.04
* pcsc-lite 1.8.26
* libusb 0.1.4
* Identiv 3701 F (オレンジタグス R1-1R)


# インストール

```zsh
sudo apt-get install pcscd
sudo apt-get install libusb-0.1.4
sudo apt-get install opensc
```

[Identivのサポート](https://support.identiv.com/3700f/)から、Linux用ドライバをダウンロードします。
`scmccid.bundle`というディレクトリをまるごと`/usr/lib/pcsc/drivers`へコピーします。

# pcscdの起動

とりあえずフロントエンドで立ち上げて、デバッグメッセージを出力させます。

```zsh
/usr/sbin/pcscd -d -f
```

# APDUコマンドの構造

| フィールド | 説明 | 
|:--|:--|
| CLA  | 命令クラス  | 
| INS  | 命令コード  |
| P1  | パラメータ1  | 
| P2  | パラメータ2  |
| LC | データの長さ | 
| Data  | データ  | 
| LE | レスポンスの長さ |

## いろいろなパターン

### データもレスポンスもなし

|CLA|INS|P1|P2|
|---|---|---|---|

### データあり、レスポンスなし

|CLA|INS|P1|P2|LC|Data|
|---|---|---|---|---|---|

|CLA|INS|P1|P2|*0x00*|LC1|LC2|Data|
|---|---|---|---|---|---|---|---|

### データなし、レスポンスあり

|CLA|INS|P1|P2|*0x00*|LE1|LE2|
|---|---|---|---|---|---|---|

### データあり、レスポンスあり

|CLA|INS|P1|P2|LC|Data|LE|
|---|---|---|---|---|---|---|

|CLA|INS|P1|P2|LC|Data|LE1|LE2|
|---|---|---|---|---|---|---|---|

|CLA|INS|P1|P2|*0x00*|LC1|LC2|Data|LE|
|---|---|---|---|---|---|---|---|---|

|CLA|INS|P1|P2|*0x00*|LC1|LC2|Data|LE1|LE2|
|---|---|---|---|---|---|---|---|---|---|

# よくあるAPDUコマンド

よくあるAPDUコマンドです。CLAはFF固定です。

| INS | コマンド |
|:-:|:--|
| A0  | バイナリを検索  |
| A2  | レコードを検索 |
| A4  | ファイルを選択  |
| B0  | バイナリを読み取り  |
| B1  | バイナリを読み取り（暗号化チェックサム付き）  |
| B2  | レコードを読み取り  |
| B6  | レコードを読み取り（暗号化チェックサム付き）  |
| CA  | Type-Length-Valueコーディングされたデータの読み取り |
| F2  | 選択したファイルのステータス  |


# Cloud 3701 F 仮想APDUコマンド

[Identivのマニュアル](https://academy.identiv.com/pluginfile.php/778/mod_resource/content/1/CLOUD%20370x%20F%20User%20Manual.pdf)からの引用です。

| コマンド | CLA | INS | P1 | P2 | P3 | DATA |
|:--|:-:|:-:|:-:|:-:|:-:|:--|
| パススルー | FF | FE | 00 | 00 | データの長さ | データ |
| Felica REQC  | FF  | 40  | 00  | 00  | 04  | システムコード(2バイト)、将来用予約（1バイト）、タイムスロットナンバー（2バイト）の合計4バイト |
| Felica REQ Service  | FF  | 42  | サービスまたはエリアの数  | 00  | P1 × 2  | サービスまたはエリアのリスト |
| Felica REQ Response | FF  | 44  | 00  | 00  | 00  | - |
| Felica Read Block  | FF  | 46  | サービスの数   |ブロックの数   | (P1 + P2) × 2 | サービスまたはブロックのリスト |
| Felica Write Block  | FF | 48 | サービスの数 | ブロックの数 | (P1 + P2) × 2 + P2 × 16 | サービスまたはブロックのリスト、ブロックデータ
| Felica REQ SYSTEM CODE | FF | 4A | 00 | 00 | 00 | - |

# Felica APDUコマンド

Felicaの場合、CLA、INS、P1、P2は固定かも？あるいは、カードリーダーごとに決まった値を入れるのかも？
Dataのほうに、Felicaで定義されたコマンドを入れるのかも？

| CLA | INS | P1 | P2 | LE | Data |
|:-:|:-:|:-:|:-:|:-:|:-:|
| FF | ? | ? | ? | Dataの長さ | Felicaコマンドとデータ |




# Suicaサービスコード

| サービス | コード |
|:--|:-:|
| 利用履歴 (20レコード)  | 09 0F  |
| 種別と残額  | 00 8B  |
| 入出場履歴 | 10 8F |

# Suica APDUコマンド（Pasori用？）

試していますが、INSエラーで結果返ってこないです。
Pasoriじゃないとダメ？？？

| コマンド | CLA | INS | P1 | P2 | LC | DATA | LE |
|:--|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| ファイルの選択  | FF  | A4  | 00  | 01  | 02  | 0F 09 | -
| 履歴の読み込み | FF  | B0  | 00  | 00  | -  | - | 00 FF FF |


# リンク

* Cloud 3701 Fマニュアル https://academy.identiv.com/pluginfile.php/778/mod_resource/content/1/CLOUD%20370x%20F%20User%20Manual.pdf
* pcsc-lite https://pcsclite.apdu.fr/
* pythonサンプルプログラム https://pyscard.sourceforge.io/user-guide.html#monitoring-smart-cards
* APDUコマンドとレスポンスの解説 http://eternalwindows.jp/security/scard/scard07.html
* C# Suica読み取りプログラム https://tomosoft.jp/design/?p=5543
* OpenSCの使い方 https://qiita.com/gebo/items/cb2dd393170767852fb3
* Felicaの仕様 https://qiita.com/YasuakiNakazawa/items/3109df682af2a7032f8d
* https://qiita.com/YasuakiNakazawa/items/a509acee1f65272bc933
* https://blog.kalan.dev/core-nfc-en/
* サービスコードのリスト http://jennychan.web.fc2.com/format/suica.html
* SONY Felica技術情報 https://www.sony.co.jp/Products/felica/business/tech-support/