SlideShare a Scribd company logo
HCE で Type4 タグごっこ
2013/12/12
@hiero_adgjmptw
このスライドについて
• このスライドでは、下記を行ないます
– Android 4.4 の新機能である HCE の簡単な紹介
– それを使ったサービスの作成方法の紹介
– サービスのサンプルとして、なんちゃって Type4 タ
グとして振る舞うサービスの作成

2
HCE の簡単な紹介

3
簡単な紹介
• HCE (Host-based Card Emulation) は、Android
4.4 KitKat で導入された新機能
• 今まで FeilCa チップや UIM といった SE
(Secure Element) 上で行っていたカード動作を
Host (Android OS) 上で行う
• これにより、端末がカードのように振る舞える
– 具体的な例としては、チケットとか、会員証とか

• プロトコルとしては ISO-DEP(ISO 14443-4) 上
に APDU コマンド(ISO7816-4) を流す形
– Type 4 タグ的な感じ

• Host 上で動く(擬似)カードは
HostApduService を継承したサービスとして誰
でも実装できる
4
SE はいらない!の図
今、一般的なカードエミュレー
ション

HCE を使ったカードエミュレー
ション

Android device

Android device

Host CPU

NFC
Controller

NFC Reader

Host CPU

Secure
Element

NFC
Controller

Secure
Element

NFC Reader

※Secure Element を使わないので、Secure Element 非対応端末でもカードエミュレーションが出来
る
※一般的に管理が厳格な Secure Element と異なり、誰でもカードアプリを作成できる
5
関連するプロトコル!の図
サービス開発者は
ここを使って実装
する
ISO7816-4 IC カード仕様
APDU コマンド定義とかここ

ISO14443-3 Activation & Anti-collision
いわゆる Type A とか B とか
ISO14443-2 RF 層

ISO14443-1 物理層

システムでやってくれる

ISO14443-4 通信プロトコル
ISO-DEP だのなんだの

6
サービスの作り方

7
サービスの作り方
• 簡単 3ステップ!
– HostApduService を継承したサービスを実装する
– サービスの Manifest に Permission や Intentfilter を定義する
– 反応する AID を定義した xml ファイルを作る

8
準備
• Eclipse で Project を作る!
– API は Level19 (4.4) 以上にする
– Activity は不要なのでチェックはずす

新規AndroidProject

Activity はいらない

API Level は 19 (4.4)

9
サービスを実装する
• HostApduService クラスを継承したサービスを
実装する
– onTagDiscovered を実装して、ここでやりたいこと
をする!

新規 Class

HostApduService を継承

10
サービスを実装する
public class HceNdefTagSample extends HostApduService {
static enum CardStatus { INIT, SELECTED }
final static byte[] SUCCESS = {(byte) 0x90, (byte) 0x00 };
CardStatus mCardStatus = CardStatus.INIT;
@Override
public void onDeactivated(int arg0) {
// Reader から離れると、この API が呼び出される
mCardStatus = CardStatus.INIT;
}
@Override
public byte[] processCommandApdu(byte[] cmd, Bundle arg1) {
// Reader からコマンドが送信されると、この API が呼び出される
if(mCardStatus == CardStatus.INIT){
// 最初のコマンド == SELECT AID には 9000 を返す
mCardStatus = CardStatus.SELECTED;
return SUCCESS;
}
// 来たコマンドを 9000 をつけてオウム返しする
ByteBuffer buf = ByteBuffer.allocate(cmd.length+SUCCESS.length);
buf.put(cmd);
buf.put(SUCCESS);
return buf.array();
}
}

11
Manifest に定義する
• 作成したサービスの AndroidManifest.xml に下
記を行う:
– android.permission.NFC の Permission を追加
– android.permission.BIND_NFC_SERVICE の
Permission を追加
– android.nfc.cardemulation.action.HOST_APDU_SERV
ICE の action で起動するように intent-filter を
追加
– 反応する AID を定義した xml ファイルを metadata として指定

12
Manifest に定義する
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.hcendeftagsample"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="19"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.NFC"/>

NFC を使う

<application
android:allowBackup="true"
作ったサービスを登
android:icon="@drawable/ic_launcher"
録
android:label="@string/app_name"
android:theme="@style/AppTheme" >
Reader にかざされた
<service android:name=".HceNdefTagSample"
Permission を追加
時に起動するように
android:exported="true"
intent-filter 追加
android:permission="android.permission.BIND_NFC_SERVICE">
<intent-filter>
<action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data android:name="android.nfc.cardemulation.host_apdu_service"
android:resource="@xml/apduservice"/>
</service>
反応する AID を定義した
</application>
外部 xml ファイルの指定
</manifest>

13
AID を定義した xml を作る
• /res/xml/ の下に AID を定義した xml を作る
– ファイル名は、さっき AndroidManifest.xml の
meta-data で指定したもの

xml フォルダを作って
新しく xml ファイルを
作成

14
AID を定義した xml を作る
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/app_name"
android:requireDeviceUnlock="false">
<aid-group android:description="@string/aid_description"
android:category="other">
<aid-filter android:name=" F0010203040506 "/>
</aid-group>
反応する AID を定義
</host-apdu-service>

複数の AID をまとめて aid-group を定義
#なぜかAID 単品では定義できない…(´・ω・
`)
##Description は文字列を直接指定できない
##ので String.xml に文字列定義を追加するこ
と

15
Install/実行
• 前述の作業を完了したら、通常通り apk を
insatll すれば OK
– adb install ***.apk

• あとは、登録した AID 向けの SELECT コマンド
を NFC Reader/Writer から受信すれば、自動的
にサービスが起動して動作します
• 実際に実行した時のコマンド・レスポンスは下
記の通り
処理(例)
データの流
れ
対向→端末

00 A4 04 00 07 F0 01 02 03 04 05 06

対向←端末

90 00

対向→端末

00 01 02 03 04 01 02 03 04

対向←端末

00 01 02 03 04 01 02 03 04 90 00
16
サンプル:なんちゃってTYPE4タ
グ
17
Type4 の NDEF タグ
• HCE を使い、Type 4 の NDEF タグっぽい動きを
するサービスを実装してみる
• やらないといけないことは下記:
– NDEF Tag Application の AID で反応するようにす
る
– NDEF Tag アプリケーションっぽく振る舞う Service
を実装する

18
NDEF Tag Application に反応
• Type 4 の NDEF タグは固定名の AID のアプリ
ケーション (NDEF Tag Application) を持って
いる
• NDEF Tag Application は
AID: D2760000850101
• さっき作った apduservice.xml の AID をこの
ID に変更すれば、NDEF Tag の読み出しに反応
できるようになる
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/app_name"
android:requireDeviceUnlock="false">
<aid-group android:description="@string/aid_description"
android:category="other">
<aid-filter android:name=" D2760000850101 "/>
</aid-group>
NDEF Tag Application に反応するように指定
</host-apdu-service>

19
NDEF Tag App. の中身を実装
• onTagDiscovered() が NDEF Tag Application
として振る舞うように動作するように実装する
• 具体的には:
– NDEF Tag Application が選択されたら動く
– 中には2つのファイルがある:
• Capability Container FILE … 読み書きの最大データサイ
ズや NDEF FILE の ID などが格納されているファイル
• NDEF FILE … NDEF 本体が格納されているファイル

– なので、onTagDiscovered() ではそれぞれのファイ
ルが選択、Read された際に適切にデータを返せるよ
うにする

20
NDEF Tag App. の中身を実装
• NDEF タグ読み出し処理の流れは下記:
データの流
れ

処理

対向→端末

対向 R/W から、NDEF Tag Application が SELECT される

対向←端末

90 00 を返却する

対向→端末

対向 R/W から CCFILE が SELECT される

対向←端末

90 00 を返却する

対向→端末

対向 R/W から READ BINARY(offset:0/size:16バイト)される

対向←端末

CCFILE の情報(アクセス制御情報、NDEF FILE識別子等)を返却する

対向→端末

対向 R/W NDEFFILE が SELECT される

対向←端末

90 00 を返却する

対向→端末

対向 R/W から READ BINARY(offset:0/size:2バイト)される

対向←端末

NDEF データのサイズを返却する

対向→端末

対向 R/W から READ BINARY(offset:2/size:NDEFサイズバイト) される

対向←端末

NDEF データを返却する

21
NDEF Tag App. の中身を実装
@Override
public byte[] processCommandApdu(byte[] apdu, Bundle arg1) {
switch(mCardStatus){
case INIT: // 初期状態
if(checkCmd(apdu, CMD_SELECT_BY_DF) && checkData(apdu, strToHex(TAGAPP_AID))){
mCardStatus = CardStatus.TAGAPP_SELECTED;
return RES_SUCCESS;
}
return RES_NOTFOUND;
case TAGAPP_SELECTED: // NDEF TAG App. が選択された状態
if(apdu[INS] == INS_SELECT){
return selectFile(apdu);
}
case CCFILE_SELECTED: // CCFILE が選択された状態、16バイト、通信の最大サイズとかが書かれてる
if(apdu[INS] == INS_SELECT){
return selectFile(apdu);
}
if(apdu[INS] == INS_READ_BINARY){
int offset = apdu[P1]*256 + apdu[P2];
int length = apdu[LC];
return Arrays.copyOfRange(strToHex(CCFILE_DATA), offset, offset+length);
}
return RES_NOTFOUND;
// 続く

22
NDEF Tag App. の中身を実装
case NDEFFILE_SELECTED: // NDEFFILE が選択された状態、先頭2バイトはサイズ、その後ろは NDEF そのもの
if(apdu[INS] == INS_SELECT){
return selectFile(apdu);
}
if(apdu[INS] == INS_READ_BINARY){
int offset = apdu[P1]*256 + apdu[P2];
int length = apdu[LC];
return Arrays.copyOfRange(mNdefMessageData, offset, offset+length);
}
return RES_NOTFOUND;
default:
break;
}
return RES_NOTFOUND;
}
private byte[] selectFile(byte[] apdu) {
if(checkCmd(apdu, CMD_SELECT_EF)){
if(checkData(apdu, strToHex(CCFILE_EF))){
mCardStatus = CardStatus.CCFILE_SELECTED;
}
if(checkData(apdu, strToHex(NDEFFILE_EF))){
mCardStatus = CardStatus.NDEFFILE_SELECTED;
}
return RES_SUCCESS;
}
return RES_NOTFOUND;
}
// その他、各種定義とか省略

23
実行
• 実際に実行した時のコマンド・レスポンスは下
記の通り
データの流
れ
対向→端末

00 A4 04 00 07 D2 76 00 00 85 01 01 00 (NDEF タグアプリ読むよ)

対向←端末

90 00 (おっけー)

対向→端末

00 A4 00 0C 02 E1 03 (CCFILE 開くよ)

対向←端末

90 00 (おっけー)

対向→端末

00 B0 00 00 0F (00~0F のデータ頂戴)

対向←端末

0F 20 00 40 00 40 E1 04 04 00 00 FF 00 00 00 (はいこれ~)

対向→端末

00 A4 00 0C 02 E1 04 (NDEF は E104 なのね?じゃあそれ開いて)

対向←端末

90 00 (おっけー)

対向→端末

00 B0 00 00 02 (じゃあ最初の2バイト=NDEFサイズ教えて)

対向←端末

00 0F (15バイトだよ)

対向→端末

00 B0 00 02 12 (じゃあ2バイト目から15バイトの NDEF 読むね)

対向←端末

D1 01 0B 55 01 67 6F 6F 67 6C 65 2E 63 6F 6D 00 00 00 (はい、これが NDEF)

24
最後に

25
やってみた感想
• とりあえず Reader/Writer に反応するようにす
るのはとても簡単
• セキュリティ的にうるさく無いシステムなら、
今 Type A カードでやってるようなサービス
(入出門管理とか)は簡単にモバイル対応でき
る気がする
• セキュリティが大切なやつはクラウド側でやれ
ばいいか?
• 作ったなんちゃって Type 4 タグを Android 端
末で読もうとしたら「タップしてビーム」とか
言われてがっかり
– enableReaderMode できる 4.4 端末が欲しい(´・
26
参考資料
• Android Developers
http://developer.android.com/intl/ja/guide/topics/connectivity/nfc
/hce.html

• 上記ページの和訳サイト
http://dev.classmethod.jp/smartphone/kitkat-host-based-cardemulation/

• ブライテクノblog
http://brightechno.com/blog/archives/179

• ISO7816-4
http://www.ttfn.net/techno/smartcards/iso7816_4.html

• NFC Forum
http://www.nfc-forum.org/home/

27
ソース
• githubとかにあげるといいのかなぁ…(´・ω・
`)

28

More Related Content

What's hot

[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...
[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...
[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...
CODE BLUE
 
Windows 10 mobileでnfc~suica・edy対応編~(公開用)
Windows 10 mobileでnfc~suica・edy対応編~(公開用)Windows 10 mobileでnfc~suica・edy対応編~(公開用)
Windows 10 mobileでnfc~suica・edy対応編~(公開用)
Nobuaki Aoki
 
nfcpy 0.10.0 でハマった話
nfcpy 0.10.0 でハマった話nfcpy 0.10.0 でハマった話
nfcpy 0.10.0 でハマった話
Masaki Yamamoto
 
MIFARE ClassicのAccess Conditions
MIFARE ClassicのAccess ConditionsMIFARE ClassicのAccess Conditions
MIFARE ClassicのAccess ConditionsHirokuma Ueno
 
ConfD で Linux にNetconfを喋らせてみた
ConfD で Linux にNetconfを喋らせてみたConfD で Linux にNetconfを喋らせてみた
ConfD で Linux にNetconfを喋らせてみた
Akira Iwamoto
 
FreeBSD and Drivers
FreeBSD and DriversFreeBSD and Drivers
FreeBSD and Drivers
Kernel TLV
 
TEE (Trusted Execution Environment)は第二の仮想化技術になるか?
TEE (Trusted Execution Environment)は第二の仮想化技術になるか?TEE (Trusted Execution Environment)は第二の仮想化技術になるか?
TEE (Trusted Execution Environment)は第二の仮想化技術になるか?
Kuniyasu Suzaki
 
AndroidでFeliCaの履歴を読もう
AndroidでFeliCaの履歴を読もうAndroidでFeliCaの履歴を読もう
AndroidでFeliCaの履歴を読もう
treby
 
P4 Updates (2020) (Japanese)
P4 Updates (2020) (Japanese)P4 Updates (2020) (Japanese)
P4 Updates (2020) (Japanese)
Kentaro Ebisawa
 
MCC CTF講習会 pwn編
MCC CTF講習会 pwn編MCC CTF講習会 pwn編
MCC CTF講習会 pwn編
hama7230
 
FeliCa/NFCの概説とAndroidの対応状況
FeliCa/NFCの概説とAndroidの対応状況FeliCa/NFCの概説とAndroidの対応状況
FeliCa/NFCの概説とAndroidの対応状況
Isao Soma
 
Lagopus + DockerのDPDK接続
Lagopus + DockerのDPDK接続Lagopus + DockerのDPDK接続
Lagopus + DockerのDPDK接続
Tomoya Hibi
 
TripleOの光と闇
TripleOの光と闇TripleOの光と闇
TripleOの光と闇
Manabu Ori
 
Ansibleではじめるサーバー・ネットワークの自動化(2019/04版)
Ansibleではじめるサーバー・ネットワークの自動化(2019/04版)Ansibleではじめるサーバー・ネットワークの自動化(2019/04版)
Ansibleではじめるサーバー・ネットワークの自動化(2019/04版)
akira6592
 
Onieで遊んでみようとした話
Onieで遊んでみようとした話Onieで遊んでみようとした話
Onieで遊んでみようとした話
Masaru Oki
 
High-Performance Networking Using eBPF, XDP, and io_uring
High-Performance Networking Using eBPF, XDP, and io_uringHigh-Performance Networking Using eBPF, XDP, and io_uring
High-Performance Networking Using eBPF, XDP, and io_uring
ScyllaDB
 
Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)
ryos36
 
Reconnaissance of Virtio: What’s new and how it’s all connected?
Reconnaissance of Virtio: What’s new and how it’s all connected?Reconnaissance of Virtio: What’s new and how it’s all connected?
Reconnaissance of Virtio: What’s new and how it’s all connected?
Samsung Open Source Group
 
VPP事始め
VPP事始めVPP事始め
VPP事始め
npsg
 

What's hot (20)

[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...
[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...
[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...
 
Windows 10 mobileでnfc~suica・edy対応編~(公開用)
Windows 10 mobileでnfc~suica・edy対応編~(公開用)Windows 10 mobileでnfc~suica・edy対応編~(公開用)
Windows 10 mobileでnfc~suica・edy対応編~(公開用)
 
nfcpy 0.10.0 でハマった話
nfcpy 0.10.0 でハマった話nfcpy 0.10.0 でハマった話
nfcpy 0.10.0 でハマった話
 
MIFARE ClassicのAccess Conditions
MIFARE ClassicのAccess ConditionsMIFARE ClassicのAccess Conditions
MIFARE ClassicのAccess Conditions
 
ConfD で Linux にNetconfを喋らせてみた
ConfD で Linux にNetconfを喋らせてみたConfD で Linux にNetconfを喋らせてみた
ConfD で Linux にNetconfを喋らせてみた
 
FreeBSD and Drivers
FreeBSD and DriversFreeBSD and Drivers
FreeBSD and Drivers
 
TEE (Trusted Execution Environment)は第二の仮想化技術になるか?
TEE (Trusted Execution Environment)は第二の仮想化技術になるか?TEE (Trusted Execution Environment)は第二の仮想化技術になるか?
TEE (Trusted Execution Environment)は第二の仮想化技術になるか?
 
AndroidでFeliCaの履歴を読もう
AndroidでFeliCaの履歴を読もうAndroidでFeliCaの履歴を読もう
AndroidでFeliCaの履歴を読もう
 
P4 Updates (2020) (Japanese)
P4 Updates (2020) (Japanese)P4 Updates (2020) (Japanese)
P4 Updates (2020) (Japanese)
 
MCC CTF講習会 pwn編
MCC CTF講習会 pwn編MCC CTF講習会 pwn編
MCC CTF講習会 pwn編
 
FeliCa/NFCの概説とAndroidの対応状況
FeliCa/NFCの概説とAndroidの対応状況FeliCa/NFCの概説とAndroidの対応状況
FeliCa/NFCの概説とAndroidの対応状況
 
Lagopus + DockerのDPDK接続
Lagopus + DockerのDPDK接続Lagopus + DockerのDPDK接続
Lagopus + DockerのDPDK接続
 
TripleOの光と闇
TripleOの光と闇TripleOの光と闇
TripleOの光と闇
 
Ansibleではじめるサーバー・ネットワークの自動化(2019/04版)
Ansibleではじめるサーバー・ネットワークの自動化(2019/04版)Ansibleではじめるサーバー・ネットワークの自動化(2019/04版)
Ansibleではじめるサーバー・ネットワークの自動化(2019/04版)
 
Onieで遊んでみようとした話
Onieで遊んでみようとした話Onieで遊んでみようとした話
Onieで遊んでみようとした話
 
Android binder-ipc
Android binder-ipcAndroid binder-ipc
Android binder-ipc
 
High-Performance Networking Using eBPF, XDP, and io_uring
High-Performance Networking Using eBPF, XDP, and io_uringHigh-Performance Networking Using eBPF, XDP, and io_uring
High-Performance Networking Using eBPF, XDP, and io_uring
 
Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)
 
Reconnaissance of Virtio: What’s new and how it’s all connected?
Reconnaissance of Virtio: What’s new and how it’s all connected?Reconnaissance of Virtio: What’s new and how it’s all connected?
Reconnaissance of Virtio: What’s new and how it’s all connected?
 
VPP事始め
VPP事始めVPP事始め
VPP事始め
 

Similar to HCEでなんちゃってType4のNDEFタグをつくる

omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜
Sotaro Omura
 
PF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaPF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaandroid sola
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回Naoyuki Yamada
 
Telemetryについて
TelemetryについてTelemetryについて
Telemetryについて
tetsusat
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方linzhixing
 
Ci tutorial
Ci tutorialCi tutorial
Ci tutorial
Kazuaki Ueda
 
Ext.direct
Ext.directExt.direct
Ext.direct
Shuhei Aoyama
 
Develop Web Application with Node.js + Express
Develop Web Application with Node.js + ExpressDevelop Web Application with Node.js + Express
Develop Web Application with Node.js + Express
Akinari Tsugo
 
perfを使ったPostgreSQLの解析(後編)
perfを使ったPostgreSQLの解析(後編)perfを使ったPostgreSQLの解析(後編)
perfを使ったPostgreSQLの解析(後編)
NTT DATA OSS Professional Services
 
Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析
Mr. Vengineer
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
kenjis
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
kenjis
 
Symfony2からdoctrine mongo db odmを使ってみる
Symfony2からdoctrine mongo db odmを使ってみるSymfony2からdoctrine mongo db odmを使ってみる
Symfony2からdoctrine mongo db odmを使ってみる
Koji Iwazaki
 
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
Preferred Networks
 
EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成
EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成
EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成
Kiyoshi Sawada
 
Dockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックDockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニック
Emma Haruka Iwao
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
Toru Yamaguchi
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1kenjis
 

Similar to HCEでなんちゃってType4のNDEFタグをつくる (20)

omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜
 
PF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaPF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsola
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 
Rails vim easy
Rails vim easyRails vim easy
Rails vim easy
 
Telemetryについて
TelemetryについてTelemetryについて
Telemetryについて
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
 
Ci tutorial
Ci tutorialCi tutorial
Ci tutorial
 
Ext.direct
Ext.directExt.direct
Ext.direct
 
Develop Web Application with Node.js + Express
Develop Web Application with Node.js + ExpressDevelop Web Application with Node.js + Express
Develop Web Application with Node.js + Express
 
perfを使ったPostgreSQLの解析(後編)
perfを使ったPostgreSQLの解析(後編)perfを使ったPostgreSQLの解析(後編)
perfを使ったPostgreSQLの解析(後編)
 
Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 
Symfony2からdoctrine mongo db odmを使ってみる
Symfony2からdoctrine mongo db odmを使ってみるSymfony2からdoctrine mongo db odmを使ってみる
Symfony2からdoctrine mongo db odmを使ってみる
 
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
 
EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成
EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成
EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成
 
Dockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックDockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニック
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 

Recently uploaded

YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
NTT DATA Technology & Innovation
 
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
atsushi061452
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
Fukuoka Institute of Technology
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
atsushi061452
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
Sony - Neural Network Libraries
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
iPride Co., Ltd.
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
yassun7010
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
harmonylab
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance
 

Recently uploaded (15)

YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
 

HCEでなんちゃってType4のNDEFタグをつくる

  • 1. HCE で Type4 タグごっこ 2013/12/12 @hiero_adgjmptw
  • 2. このスライドについて • このスライドでは、下記を行ないます – Android 4.4 の新機能である HCE の簡単な紹介 – それを使ったサービスの作成方法の紹介 – サービスのサンプルとして、なんちゃって Type4 タ グとして振る舞うサービスの作成 2
  • 4. 簡単な紹介 • HCE (Host-based Card Emulation) は、Android 4.4 KitKat で導入された新機能 • 今まで FeilCa チップや UIM といった SE (Secure Element) 上で行っていたカード動作を Host (Android OS) 上で行う • これにより、端末がカードのように振る舞える – 具体的な例としては、チケットとか、会員証とか • プロトコルとしては ISO-DEP(ISO 14443-4) 上 に APDU コマンド(ISO7816-4) を流す形 – Type 4 タグ的な感じ • Host 上で動く(擬似)カードは HostApduService を継承したサービスとして誰 でも実装できる 4
  • 5. SE はいらない!の図 今、一般的なカードエミュレー ション HCE を使ったカードエミュレー ション Android device Android device Host CPU NFC Controller NFC Reader Host CPU Secure Element NFC Controller Secure Element NFC Reader ※Secure Element を使わないので、Secure Element 非対応端末でもカードエミュレーションが出来 る ※一般的に管理が厳格な Secure Element と異なり、誰でもカードアプリを作成できる 5
  • 6. 関連するプロトコル!の図 サービス開発者は ここを使って実装 する ISO7816-4 IC カード仕様 APDU コマンド定義とかここ ISO14443-3 Activation & Anti-collision いわゆる Type A とか B とか ISO14443-2 RF 層 ISO14443-1 物理層 システムでやってくれる ISO14443-4 通信プロトコル ISO-DEP だのなんだの 6
  • 8. サービスの作り方 • 簡単 3ステップ! – HostApduService を継承したサービスを実装する – サービスの Manifest に Permission や Intentfilter を定義する – 反応する AID を定義した xml ファイルを作る 8
  • 9. 準備 • Eclipse で Project を作る! – API は Level19 (4.4) 以上にする – Activity は不要なのでチェックはずす 新規AndroidProject Activity はいらない API Level は 19 (4.4) 9
  • 10. サービスを実装する • HostApduService クラスを継承したサービスを 実装する – onTagDiscovered を実装して、ここでやりたいこと をする! 新規 Class HostApduService を継承 10
  • 11. サービスを実装する public class HceNdefTagSample extends HostApduService { static enum CardStatus { INIT, SELECTED } final static byte[] SUCCESS = {(byte) 0x90, (byte) 0x00 }; CardStatus mCardStatus = CardStatus.INIT; @Override public void onDeactivated(int arg0) { // Reader から離れると、この API が呼び出される mCardStatus = CardStatus.INIT; } @Override public byte[] processCommandApdu(byte[] cmd, Bundle arg1) { // Reader からコマンドが送信されると、この API が呼び出される if(mCardStatus == CardStatus.INIT){ // 最初のコマンド == SELECT AID には 9000 を返す mCardStatus = CardStatus.SELECTED; return SUCCESS; } // 来たコマンドを 9000 をつけてオウム返しする ByteBuffer buf = ByteBuffer.allocate(cmd.length+SUCCESS.length); buf.put(cmd); buf.put(SUCCESS); return buf.array(); } } 11
  • 12. Manifest に定義する • 作成したサービスの AndroidManifest.xml に下 記を行う: – android.permission.NFC の Permission を追加 – android.permission.BIND_NFC_SERVICE の Permission を追加 – android.nfc.cardemulation.action.HOST_APDU_SERV ICE の action で起動するように intent-filter を 追加 – 反応する AID を定義した xml ファイルを metadata として指定 12
  • 13. Manifest に定義する <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.hcendeftagsample" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.NFC"/> NFC を使う <application android:allowBackup="true" 作ったサービスを登 android:icon="@drawable/ic_launcher" 録 android:label="@string/app_name" android:theme="@style/AppTheme" > Reader にかざされた <service android:name=".HceNdefTagSample" Permission を追加 時に起動するように android:exported="true" intent-filter 追加 android:permission="android.permission.BIND_NFC_SERVICE"> <intent-filter> <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <meta-data android:name="android.nfc.cardemulation.host_apdu_service" android:resource="@xml/apduservice"/> </service> 反応する AID を定義した </application> 外部 xml ファイルの指定 </manifest> 13
  • 14. AID を定義した xml を作る • /res/xml/ の下に AID を定義した xml を作る – ファイル名は、さっき AndroidManifest.xml の meta-data で指定したもの xml フォルダを作って 新しく xml ファイルを 作成 14
  • 15. AID を定義した xml を作る <host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android" android:description="@string/app_name" android:requireDeviceUnlock="false"> <aid-group android:description="@string/aid_description" android:category="other"> <aid-filter android:name=" F0010203040506 "/> </aid-group> 反応する AID を定義 </host-apdu-service> 複数の AID をまとめて aid-group を定義 #なぜかAID 単品では定義できない…(´・ω・ `) ##Description は文字列を直接指定できない ##ので String.xml に文字列定義を追加するこ と 15
  • 16. Install/実行 • 前述の作業を完了したら、通常通り apk を insatll すれば OK – adb install ***.apk • あとは、登録した AID 向けの SELECT コマンド を NFC Reader/Writer から受信すれば、自動的 にサービスが起動して動作します • 実際に実行した時のコマンド・レスポンスは下 記の通り 処理(例) データの流 れ 対向→端末 00 A4 04 00 07 F0 01 02 03 04 05 06 対向←端末 90 00 対向→端末 00 01 02 03 04 01 02 03 04 対向←端末 00 01 02 03 04 01 02 03 04 90 00 16
  • 18. Type4 の NDEF タグ • HCE を使い、Type 4 の NDEF タグっぽい動きを するサービスを実装してみる • やらないといけないことは下記: – NDEF Tag Application の AID で反応するようにす る – NDEF Tag アプリケーションっぽく振る舞う Service を実装する 18
  • 19. NDEF Tag Application に反応 • Type 4 の NDEF タグは固定名の AID のアプリ ケーション (NDEF Tag Application) を持って いる • NDEF Tag Application は AID: D2760000850101 • さっき作った apduservice.xml の AID をこの ID に変更すれば、NDEF Tag の読み出しに反応 できるようになる <host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android" android:description="@string/app_name" android:requireDeviceUnlock="false"> <aid-group android:description="@string/aid_description" android:category="other"> <aid-filter android:name=" D2760000850101 "/> </aid-group> NDEF Tag Application に反応するように指定 </host-apdu-service> 19
  • 20. NDEF Tag App. の中身を実装 • onTagDiscovered() が NDEF Tag Application として振る舞うように動作するように実装する • 具体的には: – NDEF Tag Application が選択されたら動く – 中には2つのファイルがある: • Capability Container FILE … 読み書きの最大データサイ ズや NDEF FILE の ID などが格納されているファイル • NDEF FILE … NDEF 本体が格納されているファイル – なので、onTagDiscovered() ではそれぞれのファイ ルが選択、Read された際に適切にデータを返せるよ うにする 20
  • 21. NDEF Tag App. の中身を実装 • NDEF タグ読み出し処理の流れは下記: データの流 れ 処理 対向→端末 対向 R/W から、NDEF Tag Application が SELECT される 対向←端末 90 00 を返却する 対向→端末 対向 R/W から CCFILE が SELECT される 対向←端末 90 00 を返却する 対向→端末 対向 R/W から READ BINARY(offset:0/size:16バイト)される 対向←端末 CCFILE の情報(アクセス制御情報、NDEF FILE識別子等)を返却する 対向→端末 対向 R/W NDEFFILE が SELECT される 対向←端末 90 00 を返却する 対向→端末 対向 R/W から READ BINARY(offset:0/size:2バイト)される 対向←端末 NDEF データのサイズを返却する 対向→端末 対向 R/W から READ BINARY(offset:2/size:NDEFサイズバイト) される 対向←端末 NDEF データを返却する 21
  • 22. NDEF Tag App. の中身を実装 @Override public byte[] processCommandApdu(byte[] apdu, Bundle arg1) { switch(mCardStatus){ case INIT: // 初期状態 if(checkCmd(apdu, CMD_SELECT_BY_DF) && checkData(apdu, strToHex(TAGAPP_AID))){ mCardStatus = CardStatus.TAGAPP_SELECTED; return RES_SUCCESS; } return RES_NOTFOUND; case TAGAPP_SELECTED: // NDEF TAG App. が選択された状態 if(apdu[INS] == INS_SELECT){ return selectFile(apdu); } case CCFILE_SELECTED: // CCFILE が選択された状態、16バイト、通信の最大サイズとかが書かれてる if(apdu[INS] == INS_SELECT){ return selectFile(apdu); } if(apdu[INS] == INS_READ_BINARY){ int offset = apdu[P1]*256 + apdu[P2]; int length = apdu[LC]; return Arrays.copyOfRange(strToHex(CCFILE_DATA), offset, offset+length); } return RES_NOTFOUND; // 続く 22
  • 23. NDEF Tag App. の中身を実装 case NDEFFILE_SELECTED: // NDEFFILE が選択された状態、先頭2バイトはサイズ、その後ろは NDEF そのもの if(apdu[INS] == INS_SELECT){ return selectFile(apdu); } if(apdu[INS] == INS_READ_BINARY){ int offset = apdu[P1]*256 + apdu[P2]; int length = apdu[LC]; return Arrays.copyOfRange(mNdefMessageData, offset, offset+length); } return RES_NOTFOUND; default: break; } return RES_NOTFOUND; } private byte[] selectFile(byte[] apdu) { if(checkCmd(apdu, CMD_SELECT_EF)){ if(checkData(apdu, strToHex(CCFILE_EF))){ mCardStatus = CardStatus.CCFILE_SELECTED; } if(checkData(apdu, strToHex(NDEFFILE_EF))){ mCardStatus = CardStatus.NDEFFILE_SELECTED; } return RES_SUCCESS; } return RES_NOTFOUND; } // その他、各種定義とか省略 23
  • 24. 実行 • 実際に実行した時のコマンド・レスポンスは下 記の通り データの流 れ 対向→端末 00 A4 04 00 07 D2 76 00 00 85 01 01 00 (NDEF タグアプリ読むよ) 対向←端末 90 00 (おっけー) 対向→端末 00 A4 00 0C 02 E1 03 (CCFILE 開くよ) 対向←端末 90 00 (おっけー) 対向→端末 00 B0 00 00 0F (00~0F のデータ頂戴) 対向←端末 0F 20 00 40 00 40 E1 04 04 00 00 FF 00 00 00 (はいこれ~) 対向→端末 00 A4 00 0C 02 E1 04 (NDEF は E104 なのね?じゃあそれ開いて) 対向←端末 90 00 (おっけー) 対向→端末 00 B0 00 00 02 (じゃあ最初の2バイト=NDEFサイズ教えて) 対向←端末 00 0F (15バイトだよ) 対向→端末 00 B0 00 02 12 (じゃあ2バイト目から15バイトの NDEF 読むね) 対向←端末 D1 01 0B 55 01 67 6F 6F 67 6C 65 2E 63 6F 6D 00 00 00 (はい、これが NDEF) 24
  • 26. やってみた感想 • とりあえず Reader/Writer に反応するようにす るのはとても簡単 • セキュリティ的にうるさく無いシステムなら、 今 Type A カードでやってるようなサービス (入出門管理とか)は簡単にモバイル対応でき る気がする • セキュリティが大切なやつはクラウド側でやれ ばいいか? • 作ったなんちゃって Type 4 タグを Android 端 末で読もうとしたら「タップしてビーム」とか 言われてがっかり – enableReaderMode できる 4.4 端末が欲しい(´・ 26
  • 27. 参考資料 • Android Developers http://developer.android.com/intl/ja/guide/topics/connectivity/nfc /hce.html • 上記ページの和訳サイト http://dev.classmethod.jp/smartphone/kitkat-host-based-cardemulation/ • ブライテクノblog http://brightechno.com/blog/archives/179 • ISO7816-4 http://www.ttfn.net/techno/smartcards/iso7816_4.html • NFC Forum http://www.nfc-forum.org/home/ 27