目的
Android HSEに対し、PC(PC/SC)からの接続を確認します。
環境
今回は以下の機種で動作確認しました。
Android側
- ビルド環境
- Android Studio 3.5.3
- 端末
- Sony SO-3L
- Android 9.0 (API level 28)
PC側
- NFCリーダ
- ACR1251CL-NTTCom
(PC/SCモードで使用) - OS
- Windows 10 64bit
- 言語
- Python 3.8.0
Android側
前回の記事を参照ください。
Android HCE 調査メモ(その1)
AIDは「F222222222」となっています。
HSE通信確認アプリ
簡単に確認するため、pythonを使って試してみます。
モジュール追加
pythonからPC/SCを操作するため、モジュール追加します。
pyscardには、SWINGが必要なため、事前にインストールしておきます。
SWIG
※コピーする際には、Libディレクトリもコピーすることを忘れないように。ハマりました…。
SWIGをインストールしたら、続けて以下のコマンドでモジュール追加します。
pip install pyscard
pyscardドキュメント
pyscardドキュメントは以下のURLにあります。
HCE接続 pythonスクリプト作成
pythonスクリプトを作成します。
HCE_connect.py
from smartcard.CardType import AnyCardType
from smartcard.CardConnection import CardConnection
from smartcard.CardRequest import CardRequest
from smartcard.util import toHexString
# カード接続
cardtype = AnyCardType()
cardrequest = CardRequest( timeout=1, cardType=cardtype )
cardservice = cardrequest.waitforcard()
cardservice.connection.connect( CardConnection.T1_protocol )
print ("ATR:", toHexString( cardservice.connection.getATR() ))
# AID指定で選択
SELECT = [0x00, 0xA4, 0x04, 0x00]
CARD_AID = [0xF2, 0x22, 0x22, 0x22, 0x22 ]
LEN = [len(CARD_AID)]
# APDUの組み立て
apdu = SELECT + LEN + CARD_AID
print("send apdu:", toHexString(apdu))
# 送受信
data, sw1, sw2 = cardservice.connection.transmit(apdu)
print("SW1SW2: %x %x" % (sw1, sw2))
print("received:", toHexString(data))
# 切断
cardservice.connection.disconnect()
print("...disconnected.")
pythonスクリプト実行
Androidでandroid-CardEmulationアプリを起動します。
カードリーダ上にAndroidをのせて、認識させます。
HCEが認識したのを確認したら、スクリプトを実行します。
python HCE_connect.py
結果出力
ATR: 3B 88 80 01 00 00 00 00 80 81 71 00 79
send apdu: 00 A4 04 00 05 F2 22 22 22 22
SW1SW2: 90 0
received: 30 30 30 30 30 30 30 30
...disconnected.
正常に読み出せました。
次回
C#でもアクセスできることを確認します。
Android HCE 調査メモ(その3)