SlideShare ist ein Scribd-Unternehmen logo
1 von 28
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

Weitere ähnliche Inhalte

Was ist angesagt?

Arduino + rcs620sで遊ぼう
Arduino + rcs620sで遊ぼうArduino + rcs620sで遊ぼう
Arduino + rcs620sで遊ぼうtreby
 
AndroidでFeliCaの履歴を読もう
AndroidでFeliCaの履歴を読もうAndroidでFeliCaの履歴を読もう
AndroidでFeliCaの履歴を読もうtreby
 
ハンドメイドNfcの作り方
ハンドメイドNfcの作り方ハンドメイドNfcの作り方
ハンドメイドNfcの作り方Yasuhiro Ohsaka
 
Android NFCアプリハンズオン
Android NFCアプリハンズオンAndroid NFCアプリハンズオン
Android NFCアプリハンズオンTomoki YAMASHITA
 
Tutorial WiFi driver code - Opening Nuts and Bolts of Linux WiFi Subsystem
Tutorial WiFi driver code - Opening Nuts and Bolts of Linux WiFi SubsystemTutorial WiFi driver code - Opening Nuts and Bolts of Linux WiFi Subsystem
Tutorial WiFi driver code - Opening Nuts and Bolts of Linux WiFi SubsystemDheryta Jaisinghani
 
用Raspberry Pi 學Linux I2C Driver
用Raspberry Pi 學Linux I2C Driver用Raspberry Pi 學Linux I2C Driver
用Raspberry Pi 學Linux I2C Driver艾鍗科技
 
C#, C/CLI と CUDAによる画像処理ことはじめ
C#, C/CLI と CUDAによる画像処理ことはじめC#, C/CLI と CUDAによる画像処理ことはじめ
C#, C/CLI と CUDAによる画像処理ことはじめNVIDIA Japan
 
Debugging Applications with GNU Debugger
Debugging Applications with GNU DebuggerDebugging Applications with GNU Debugger
Debugging Applications with GNU DebuggerPriyank Kapadia
 
FeliCa/NFCの概説とAndroidの対応状況
FeliCa/NFCの概説とAndroidの対応状況FeliCa/NFCの概説とAndroidの対応状況
FeliCa/NFCの概説とAndroidの対応状況Isao Soma
 
Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めCプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めMITSUNARI Shigeo
 
深入淺出C語言
深入淺出C語言深入淺出C語言
深入淺出C語言Simen Li
 
[ZigBee 嵌入式系統] ZigBee 應用實作 - 使用 TI Z-Stack Firmware
[ZigBee 嵌入式系統] ZigBee 應用實作 - 使用 TI Z-Stack Firmware[ZigBee 嵌入式系統] ZigBee 應用實作 - 使用 TI Z-Stack Firmware
[ZigBee 嵌入式系統] ZigBee 應用實作 - 使用 TI Z-Stack FirmwareSimen Li
 
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMP
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMPRTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMP
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMPMasashi Shibata
 
Pci express
Pci expressPci express
Pci expressy38y38
 
AOA2.0を実装してみた
AOA2.0を実装してみたAOA2.0を実装してみた
AOA2.0を実装してみたYuuichi Akagawa
 
realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係Yoshio Hanawa
 
Introduction to gdb
Introduction to gdbIntroduction to gdb
Introduction to gdbOwen Hsu
 
Arduino 底層原始碼解析心得
Arduino 底層原始碼解析心得Arduino 底層原始碼解析心得
Arduino 底層原始碼解析心得roboard
 

Was ist angesagt? (20)

Arduino + rcs620sで遊ぼう
Arduino + rcs620sで遊ぼうArduino + rcs620sで遊ぼう
Arduino + rcs620sで遊ぼう
 
AndroidでFeliCaの履歴を読もう
AndroidでFeliCaの履歴を読もうAndroidでFeliCaの履歴を読もう
AndroidでFeliCaの履歴を読もう
 
ハンドメイドNfcの作り方
ハンドメイドNfcの作り方ハンドメイドNfcの作り方
ハンドメイドNfcの作り方
 
Android NFCアプリハンズオン
Android NFCアプリハンズオンAndroid NFCアプリハンズオン
Android NFCアプリハンズオン
 
Tutorial WiFi driver code - Opening Nuts and Bolts of Linux WiFi Subsystem
Tutorial WiFi driver code - Opening Nuts and Bolts of Linux WiFi SubsystemTutorial WiFi driver code - Opening Nuts and Bolts of Linux WiFi Subsystem
Tutorial WiFi driver code - Opening Nuts and Bolts of Linux WiFi Subsystem
 
用Raspberry Pi 學Linux I2C Driver
用Raspberry Pi 學Linux I2C Driver用Raspberry Pi 學Linux I2C Driver
用Raspberry Pi 學Linux I2C Driver
 
C#, C/CLI と CUDAによる画像処理ことはじめ
C#, C/CLI と CUDAによる画像処理ことはじめC#, C/CLI と CUDAによる画像処理ことはじめ
C#, C/CLI と CUDAによる画像処理ことはじめ
 
Debugging Applications with GNU Debugger
Debugging Applications with GNU DebuggerDebugging Applications with GNU Debugger
Debugging Applications with GNU Debugger
 
FeliCa/NFCの概説とAndroidの対応状況
FeliCa/NFCの概説とAndroidの対応状況FeliCa/NFCの概説とAndroidの対応状況
FeliCa/NFCの概説とAndroidの対応状況
 
Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めCプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧め
 
深入淺出C語言
深入淺出C語言深入淺出C語言
深入淺出C語言
 
[ZigBee 嵌入式系統] ZigBee 應用實作 - 使用 TI Z-Stack Firmware
[ZigBee 嵌入式系統] ZigBee 應用實作 - 使用 TI Z-Stack Firmware[ZigBee 嵌入式系統] ZigBee 應用實作 - 使用 TI Z-Stack Firmware
[ZigBee 嵌入式系統] ZigBee 應用實作 - 使用 TI Z-Stack Firmware
 
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMP
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMPRTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMP
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMP
 
Pci express
Pci expressPci express
Pci express
 
AOA2.0を実装してみた
AOA2.0を実装してみたAOA2.0を実装してみた
AOA2.0を実装してみた
 
realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係
 
GDB Rocks!
GDB Rocks!GDB Rocks!
GDB Rocks!
 
Introduction to gdb
Introduction to gdbIntroduction to gdb
Introduction to gdb
 
eBPF Basics
eBPF BasicseBPF Basics
eBPF Basics
 
Arduino 底層原始碼解析心得
Arduino 底層原始碼解析心得Arduino 底層原始碼解析心得
Arduino 底層原始碼解析心得
 

Ähnlich wie 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
 
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 + ExpressAkinari Tsugo
 
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/12kenjis
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoyakenjis
 
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 #2Preferred 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 platformToru 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
 

Ähnlich wie 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
 

Kürzlich hochgeladen

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 

Kürzlich hochgeladen (8)

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 

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