Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
DroidKaigi 2023
Search
ARIYAMA Keiji
September 14, 2023
Technology
0
1.8k
DroidKaigi 2023
2023/09/14開催の DroidKaigi 2023 で発表した 「Host-based Card Emulationで簡単NFC生活」の発表資料です。
ARIYAMA Keiji
September 14, 2023
Tweet
Share
More Decks by ARIYAMA Keiji
See All by ARIYAMA Keiji
Build with AI
keiji
0
210
TechFeed Conference 2022
keiji
0
280
Android Bazaar and Conference Diverse 2021 Winter
keiji
0
870
ci-cd-conference-2021
keiji
1
1.2k
Android Bazaar and Conference 2021 Spring
keiji
3
800
TFUG KANSAI 20190928
keiji
0
120
Softpia Japan Seminar 20190724
keiji
1
170
pixiv App Night 20190611
keiji
1
590
ABC2019 Spring
keiji
1
970
Other Decks in Technology
See All in Technology
60以上のプロダクトを持つ組織における開発者体験向上への取り組み - チームAPIとBackstageで構築する組織の可視化基盤 - / sre next 2025 Efforts to Improve Developer Experience in an Organization with Over 60 Products
vtryo
3
980
【あのMCPって、どんな処理してるの?】 AWS CDKでの開発で便利なAWS MCP Servers特集
yoshimi0227
6
730
20250707-AI活用の個人差を埋めるチームづくり
shnjtk
6
4.1k
Lakebaseを使ったAIエージェントを実装してみる
kameitomohiro
0
180
OpenTelemetryセマンティック規約の恩恵とMackerel APMにおける活用例 / SRE NEXT 2025
mackerelio
3
1.6k
CDKコード品質UP!ナイスな自作コンストラクタを作るための便利インターフェース
harukasakihara
2
200
ABEMAの本番環境負荷試験への挑戦
mk2taiga
5
810
Sansanのデータプロダクトマネジメントのアプローチ
sansantech
PRO
0
230
Zero Data Loss Autonomous Recovery Service サービス概要
oracle4engineer
PRO
2
7.8k
AIの全社活用を推進するための安全なレールを敷いた話
shoheimitani
2
640
freeeのアクセシビリティの現在地 / freee's Current Position on Accessibility
ymrl
2
280
How to Quickly Call American Airlines®️ U.S. Customer Care : Full Guide
flyaahelpguide
0
240
Featured
See All Featured
The Language of Interfaces
destraynor
158
25k
RailsConf 2023
tenderlove
30
1.1k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
126
53k
Bash Introduction
62gerente
613
210k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Side Projects
sachag
455
42k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.3k
Practical Orchestrator
shlominoach
189
11k
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Code Reviewing Like a Champion
maltzj
524
40k
How to train your dragon (web standard)
notwaldorf
96
6.1k
Transcript
C-LIS CO., LTD.
)PTUCBTFE$BSE&NVMBUJPOͰ ؆୯/'$ੜ׆ %SPJE,BJHJ ༗ࢁɹܓೋʢ"3*:".",FJKJʣ
C-LIS CO., LTD. ༗ࢁܓೋʢ"3*:".",FJKJʣ $-*4$0 -5% "OESPJEΞϓϦ։ൃνϣοτσΩϧ keiji Photo
by Koji MORIGUCHI (MORIGCHOWDER)
"HFOEB εϚʔτΧʔυͱ/'$ )PTUCBTFE$BSE&NVMBUJPOʢ)$&ʣ )$&Λ࣮͢Δ εϚʔτΧʔυΛࢧ͑Δن֨
)$&ͷམͱ݀͠ ·ͱΊ
εϚʔτΧʔυ *$νοϓΛଂͯ͠ใΛॲཧʢԋࢉʣͰ͖Δ ৮ɾඇ৮ͰϦʔμʔͱ௨৴͢Δ λϯύੑͷ͋ΔνοϓͷதʹΞϓϦέʔγϣϯͱใΛ֨ೲͰ͖Δ ʮεϚʔτΧʔυʯͷఆٛɺίϯςΩετʹΑͬͯҟͳΔ߹͕͋Γ·͢
εϚʔτΧʔυͷྫ *$0$"ʗ4VJDB ΫϨδοτΧʔυ ӡస໔ڐূ ࡏཹΧʔυ ҩࢣࢿ֨ূʢ)1,*ʣ ϚΠφϯόʔΧʔυʢ+1,*ʣ
+BWB$BSE +BWBͰϓϩάϥϜՄೳͳεϚʔτΧʔυ ॻ͖͑ՄೳͳΧʔυ͕ߪೖՄೳ
+BWB$BSEͷ੍ +BWB4&ͷίϯύΠϥ͕ඞཁ +BWBͷαϒηοτ w ͑ͳ͍Ϋϥε͕͋Δ w JOU͕͑ͳ͍͜ͱ͕͋Δ ෆشൃϝϞϦͷ༰ྔ͕খ͍͞ʢ,#ఔʣ ։ൃϊϋ͕खʹೖΓͮΒ͍
/'$ /FBS'JFME$PNNVOJDBUJPOʢۙڑແઢ௨৴ʣ ʮϦʔμʔʢಡΈऔΔଆʣʯͱʮλάɾΧʔυʢಡΈऔΒΕΔଆʣʯ͕͋Δ
"OESPJEͷ/'$ରԠ Ϧʔμʔ w 'PSFHSPVOE%JTQBUDI"OESPJE w 3FBEFSNPEF"OESPJE λάʢΧʔυΤϛϡϨʔγϣϯʣ w $BSEFNVMBUJPOXJUIBTFDVSFFMFNFOU
w )PTUCBTFE$BSE&NVMBUJPO"OESPJE w )PTUCBTFE$BSE&NVMBUJPO'FMJDB"OESPJE
"HFOEB εϚʔτΧʔυͱ/'$ )PTUCBTFE$BSE&NVMBUJPOʢ)$&ʣ )$&Λ࣮͢Δ εϚʔτΧʔυΛࢧ͑Δن֨
)$&ͷམͱ݀͠ ·ͱΊ
)PTUCBTFE$BSE&NVMBUJPOʢ)$&ʣ /'$Λ௨ͯ͡ɺ"OESPJEΛλάɾΧʔυͷΑ͏ʹৼΔΘͤΔػೳ "OESPJE )PTU$16 /'$ίϯτϩʔϥʔ /'$Ϧʔμʔ IUUQTEFWFMPQFSBOESPJEDPNHVJEFUPQJDTDPOOFDUJWJUZOGDIDF
$BSE&NVMBUJPOXJUIBTFDVSFFMFNFOU IUUQTEFWFMPQFSBOESPJEDPNHVJEFUPQJDTDPOOFDUJWJUZOGDIDF $BSE&NVMBUJPOXJUIBTFDVSFFMFNFOU "OESPJE 4FDVSF&MFNFOU )PTU$16 /'$ίϯτϩʔϥʔ /'$Ϧʔμʔ
)$&ͷར εϚʔτϑΥϯΛߴػೳͳεϚʔτΧʔυͱͯ͠ར༻Ͱ͖Δ w େ༰ྔόοςϦʔ w େ༰ྔετϨʔδ w σΟεϓϨΠ w λονύωϧ
w ωοτϫʔΫ௨৴ w ೝূʹόΠϯυ͞Εͨ҉߸ݤ
)$&ͷར༻γʔϯ ϞόΠϧӡస໔ڐূ *40*&$ 1FSTPOBMJEFOUJ fi DBUJPO*40DPNQMJBOUESJWJOHMJDFODF1BSU .PCJMFESJWJOHMJDFODF N%-
BQQMJDBUJPO (PPHMFʹΑΔN%PD͓ΑͼN%PD3FBEFSͷϦϑΝϨϯε࣮ IUUQTHJUIVCDPNHPPHMFJEFOUJUZDSFEFOUJBM
"HFOEB εϚʔτΧʔυͱ/'$ )PTUCBTFE$BSE&NVMBUJPOʢ)$&ʣ )$&Λ࣮͢Δ εϚʔτΧʔυΛࢧ͑Δن֨
)$&ͷམͱ݀͠ ·ͱΊ
खॱ )PTU"QEV4FSWJDFΛ࣮ "*%ϑΟϧλʔΛهड़ "OESPJE.BOJGFTUΛઃఆ
)PTU"QEV4FSWJDFΛ࣮ class HceService : HostApduService() { override fun processCommandApdu(commandApdu:
ByteArray, extras: Bundle?): ByteArray { Log.d(TAG, "commandApdu: ${commandApdu.toHex()}") return byteArrayOf(0x90.toByte(), 0x00) } override fun onDeactivated(reason: Int) { } companion object { private val TAG: String = HceService::class.java.simpleName } } private fun ByteArray.toHex(): String = joinToString(":") { "%02x".format(it).uppercase() } private fun Byte.toUnsignedInt(): Int = (this.toInt() and 0xFF)
"*%ϑΟϧλʔΛهड़ <host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android" android:description="@string/hce_service_description" android:requireDeviceUnlock="false"> <aid-group android:category="other" android:description="@string/aid_description"> <aid-filter
android:name="F0394148148100" /> </aid-group> </host-apdu-service> SFTYNMIDFTFSWJDFYNM
"OESPJE.BOJGFTUΛઃఆ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.NFC"
/> <application> <!-- লུ --> <service android:name=".HceService" android:exported="true" android:permission="android.permission.BIND_NFC_SERVICE"> <intent-filter> <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE" /> </intent-filter> <meta-data android:name="android.nfc.cardemulation.host_apdu_service" android:resource="@xml/hceservice" /> </service> </application> </manifest>
Ϧʔμʔ͔Βͷݺͼग़͠ /'$ϦʔμʔΛ༻ҙ͢Δ w 40/:1B4P3J3$44ʢۀ༻ʣ w "EWBODFE$BSE4ZTUFNT"$36 ͳͲ ੜ࢈ऴྃ༧ఆɺݱࡏ৽ܕͷ1B4P3J3$4ʲۀ༻్ઐ༻Ϟσϧʳ͕ൢച
࣮ࡍʹݺͼग़ͯ͠ΈΔ 0QFO4$ w εϚʔτΧʔυؔͷϢʔςΟϦςΟɾϥΠϒϥϦ w NBD04ͰCSFXͰΠϯετʔϧՄೳ IUUQTHJUIVCDPN0QFO4$0QFO4$
$ opensc-tool -s 00:A4:04:00:07:F0:39:41:48:14:81:00 Using reader with a card: ACS
ACR1252 Dual Reader Sending: 00 A4 04 00 07 F0 39 41 48 14 81 00 Received (SW1=0x90, SW2=0x00) 3FDFJWFEʹଓ͍ͯɺϓϩάϥϜଆͰࢦఆͨ͠ʢY YʣΛड͚औΔ͜ͱ "OESPJE4UVEJPͷ-PH$BUʹ"͔Β࢝·ΔόΠτ͕දࣔ͞Ε͍ͯΔͷΛ֬ೝ͢Δ
)PTU"QEV4FSWJDFͷ࣮ Ϧʔμʔ͕ૹ৴ͨ͠༰processCommandApdu ͷҾcommandApdu ͱͯ͠ɺ όΠτྻͰड͚औΔ ΓͷόΠτྻɺϨεϙϯεͱͯ͠Ϧʔμʔଆʹૹ৴͞ΕΔ Ϧʔμʔ "OESPJE ιϑτΣΞ
ΞϓϦʢ)$&ʣ όΠτྻ όΠτྻ /'$
"HFOEB εϚʔτΧʔυͱ/'$ )PTUCBTFE$BSE&NVMBUJPOʢ)$&ʣ )$&Λ࣮͢Δ εϚʔτΧʔυΛࢧ͑Δن֨
)$&ͷམͱ݀͠ ·ͱΊ
$ opensc-tool -s 00:A4:04:00:07:F0:39:41:48:14:81:00 Using reader with a card: ACS
ACR1252 Dual Reader Sending: 00 A4 04 00 07 F0 39 41 48 14 81 00 Received (SW1=0x90, SW2=0x00) <host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android" android:description="@string/hce_service_description" android:requireDeviceUnlock="false"> <aid-group android:category="other" android:description="@string/aid_description"> <aid-filter android:name="F0394148148100" /> </aid-group> </host-apdu-service> ૹ৴༰Λৄ͘͠ݟΔ
"1%6 "QQMJDBUJPO1SPUPDPM%BUB6OJU 00:A4:04:00:07:F0:39:41:48:14:81:00 */4USVDUJPOCZUF໋ྩ $-"TTCZUFΫϥεόΠτ 1ύϥϝʔλʔ 1ύϥϝʔλʔ -Dσʔλ %BUB
Y"ˠ4&-&$5 *40*&$ *EFOUJ fi DBUJPODBSET*OUFHSBUFEDJSDVJUDBSET1BSU 0SHBOJ[BUJPO TFDVSJUZBOEDPNNBOETGPSJOUFSDIBOHF
$PNNBOEͱ3FTQPOTF Ϧʔμʔ "OESPJE ιϑτΣΞ ΞϓϦʢ)$&ʣ SFTQPOTF"QEV DPNNBOE"QEV /'$
"*%ʹԠͯ͡ΞϓϦΛબ Ϧʔμʔ "OESPJE ιϑτΣΞ ΞϓϦʢ)$&ʣ 4&-&$5"*% ΞϓϦʢ)$&ʣ ΞϓϦʢ)$&ʣ
"OESPJE γεςϜ બ /'$
$PNNBOE"1%6 ύλʔϯ $-"]*/4]1]1 ύλʔϯ $-"]*/4]1]1]-F ύλʔϯ $-"]*/4]1]1]-D]%BUB ύλʔϯ $-"]*/4]1]1]-D]%BUB]-F 00:A4:04:00:07:F0:39:41:48:14:81:00
*/4USVDUJPOCZUF໋ྩ $-"TTCZUFΫϥεόΠτ 1ύϥϝʔλʔ 1ύϥϝʔλʔ -Dσʔλ %BUB
3FTQPOTF"1%6 <%"5">]48]48
4UBUVT8PSE IUUQTXXXFGUMBCDPNLOPXMFEHFCBTFDPNQMFUFMJTUPGBQEVSFTQPOTFT 48 48 ҙຯ 90 "00" ޭ 61
xx ޭɻΓxxόΠτͷϨεϙϯε͕͋Δ 63 Cx PINর߹ࣦഊɻΓࢼߦՄೳճxճ 69 82 PIN͕র߹͞Ε͍ͯͳ͍ 69 83 ϒϩοΫ͞Ε͍ͯΔʢPINࢼߦՄೳճΛ աͨ͠ 6A 82 αϙʔτ͍ͯ͠ͳ͍ϑΝΠϧɾΞϓϦέʔ γϣϯ
͞·͟·ͳ*OTUSVDUJPO 4&-&$5 3&"%#*/"3: (&5%"5" 165%"5" 7&3*': $0.165&%*(*5"-4*(/"563& *40*&$*EFOUJ fi DBUJPODBSET*OUFHSBUFEDJSDVJUDBSET1BSU
$PNNBOETBOENFDIBOJTNTGPSTFDVSJUZPQFSBUJPOT ͦͷଞɺΞϓϨοτݻ༗ͷ*OTUSVDUJPOଘࡏ͢Δ
3FBE#JOBSZΛ࣮͢Δ CLA: 0x00 INS: 0xB0 P1: 0x00 P2: 0x00 Le:
0x00 $ opensc-tool \ -s 00:A4:04:00:07:F0:39:41:48:14:81:00 \ -s 00:B0:00:00:00
3FBE#JOBSZΛ࣮͢Δ ύλʔϯ $-"]*/4]1]1 ύλʔϯ $-"]*/4]1]1]-F ύλʔϯ $-"]*/4]1]1]-D]%BUB ύλʔϯ $-"]*/4]1]1]-D]%BUB]-F 00:B0:00:00:00
*/4USVDUJPODPEF໋ྩ $-"TTΫϥεόΠτ 1ύϥϝʔλʔ 1ύϥϝʔλʔ -Fظ͢Δσʔλ
"1%6ͷΤϯίʔμʔɾσίʔμʔ "OESPJEϓϥοτϑΥʔϜʹ༻ҙ͞Ε͍ͯͳ͍ w 4FDVSF&MFNFOUΞϓϦͷதʹΫϥεͱͯ͠ଘࡏ͢Δ w IUUQTBOESPJEHPPHMFTPVSDFDPNQMBUGPSNQBDLBHFTBQQT4FDVSF&MFNFOU SFGTIFBET NBJOTSDDPNBOESPJETF "1%6ΛऔΓѻ͏ϥΠϒϥϦΛ࡞
IUUQTHJUIVCDPNLFJKJKBWBDBSEQSBDUJDFUSFFNBJOBOESPJEBQQBQEV
"1%6ͷύʔεͱ3FBE#JOBSZͷ࣮ val apdu = ApduCommand.readFrom(commandApdu, 0) val cla = apdu.header.cla.toUnsignedInt()
val ins = apdu.header.ins.toUnsignedInt() Log.d(TAG, "apdu: cla:$cla, ins:$ins") val response = when (ins) { 0xA4 -> STATUS_WORD_SUCCESS 0xB0 -> ByteArray(256) { it.toByte() }.also { it[it.lastIndex] = "X".toByteArray().first() } + STATUS_WORD_SUCCESS else -> STATUS_WORD_INS_NOT_SUPPORTED_OR_INVALID } return response
࣮ߦ Using reader with a card: ACS ACR1252 Dual Reader
Sending: 00 A4 04 00 07 F0 39 41 48 14 81 00 Received (SW1=0x90, SW2=0x00) Sending: 00 B0 00 00 00 Received (SW1=0x90, SW2=0x00): 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ................ 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F ................ 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F !"#$%&'()*+,-./ 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 0123456789:;<=>? 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F @ABCDEFGHIJKLMNO 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F PQRSTUVWXYZ[\]^_ 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F `abcdefghijklmno 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F pqrstuvwxyz{|}~. 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F ................ 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F ................ A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF ................ B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF ................ C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF ................ D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF ................ E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF ................ F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD 58 ..............X $ opensc-tool \ -s 00:A4:04:00:07:F0:39:41:48:14:81:00 \ -s 00:B0:00:00:00
ඇಉظͰ݁ՌΛฦ͢ private val job = Job() private val coroutineScope =
CoroutineScope(Dispatchers.IO + job) override fun processCommandApdu(commandApdu: ByteArray, extras: Bundle?): ByteArray? { // লུ coroutineScope.launch { delay(1000) sendResponseApdu(response) } return null } override fun onDestroy() { super.onDestroy() job.cancel() }
࣮ࡍͷཧϑΝΠϧߏ ӡస໔ڐূٴͼӡస໔ڐূ࡞γεςϜ༷ॻʢ༷ॻόʔδϣϯ൪߸ɿʣ IUUQTXXXOQBHPKQMBXTOPUJ fi DBUJPOLPVUVVNFOLZPNFOLZP@QEG
࣮ࡍͷཧϑΝΠϧߏ 'VODUJPOBM4QFDJ fi DBUJPOPGUIF0QFO1(1BQQMJDBUJPOPO*404NBSU$BSE0QFSBUJOH4ZTUFNT IUUQTHOVQHPSHGUQTQFDT0QFO1(1TNBSUDBSEBQQMJDBUJPOQEG
σʔλϑΥʔϚοτʢ5-75BH-FOHUI7BMVFʣ *40*&$ *OGPSNBUJPOUFDIOPMPHZ"4/FODPEJOHSVMFT1BSU4QFDJ fi DBUJPOPG#BTJD&ODPEJOH3VMFT #&3 $BOPOJDBM&ODPEJOH3VMFT $&3 BOE%JTUJOHVJTIFE&ODPEJOH3VMFT
%&3 6E:05:00:01:02:03:04 5BH 5ZQF -FOHUI 7BMVF
5-7ͷύλʔϯ 5F:72:05:00:01:02:03:04 6E:81:C0:00:01:02:03:04 .. BF 5BHͱ-FOHIUόΠτͱݶΒͳ͍ 6E:08: 5F:72:05:00:01:02:03:04 ೖΕࢠͷߏ͕͋Γ͏Δ
5-7ͷΤϯίʔμʔɾσίʔμʔ "OESPJEϓϥοτϑΥʔϜʹ༻ҙ͞Ε͍ͯͳ͍ w "4/ͳͲҰ෦#PVODZ$BTUMFͰରԠՄೳ 5-7ΤϯίʔμʔɾσίʔμʔͷϥΠϒϥϦΛ࡞ IUUQTHJUIVCDPNLFJKJUMWLTQ
"HFOEB εϚʔτΧʔυͱ/'$ )PTUCBTFE$BSE&NVMBUJPOʢ)$&ʣ )$&Λ࣮͢Δ εϚʔτΧʔυΛࢧ͑Δن֨
)$&ͷམͱ݀͠ ·ͱΊ
ૺ۰ͨ͠ )$&ͷϨεϙϯεΛϦʔμʔଆ͕ਖ਼͘͠ॲཧ͠ͳ͍έʔε͕ൃੜ ϦʔμʔଆͷιϑτΣΞ࣮ʹৄ͘͠ͳ͍ ࠶ݱੑΛௐ͍ࠪͯ͘͠ͱɺϨεϙϯε͕CZUFTΛ͑ͨ͋ͨΓͰൃੜ͢Δ͜ͱ͕Θ ͔ͬͨ
CZUFTΛ͑Δσʔλͷૹड৴ )PTU"QEV4FSWJDFɺCZUFTΛ͑ΔσʔλΛϨεϙϯεͱͯ͠ฦ͢͜ͱ͕Ͱ͖ Δ ଞͷεϚʔτΧʔυͰͳ͘ॲཧ͍ͯ͠Δͷ͋ΔͷͰɺϦʔμʔιϑτΣ ΞɺCZUFTΛ͑ΔσʔλΛड͚औΔ͜ͱͰ͖Δ
Ϧʔμʔଆ͔Βݟͨ"OESPJE Ϧʔμʔʢ͓ΑͼιϑτΣΞʣଆ͕ɺ௨৴૬खͷ"OESPJE͕CZUFTΛ͑Δ σʔλΛૹड৴͢Δ͜ͱΛೝ͍ࣝͯ͠Δ͔ʁ Ϧʔμʔଆλονͨ͠ͱ͖ʹɺΧʔυ͕ૹ৴͢Δ"53ʢ"OTXFS5P3FTFUʣɺ 4FMFDUͨ͠ͱ͖ͷ"54ʢ"OTXFS5P4FMFDUʣΛݟ͍ͯΔՄೳੑ͕͋Δ $ opensc-tool --atr Using
reader with a card: ACS ACR1252 Dual Reader 3b:88:80:01:00:00:00:00:80:81:71:00:79
͞·͟·ͳσόΠεͷ"53 YubiKey 5 NFC 3b:8d:80:01:80:73:c0:21:c0:57:59:75:62:69:4b:65:79:f9 Pixel 6a 3b:88:80:01:00:00:00:00:80:81:71:00:79 Pixel 7a
3b:88:80:01:00:00:00:00:80:81:75:00:7d
IUUQTTNBSUDBSEBUSBQEVGSQBSTF "53CEDDCG
֦ு-D-FϑΟʔϧυ "1%6$PNNBOEͷ-D-FϑΟʔϧυόΠτͳͷͰɺCZUFT·Ͱ͔͠දݱͰ͖ ͳ͍ ֦ு-D-FͦΕͧΕΛόΠτʹ֦ு͢Δ͜ͱͰCZUFTҎ্ɺ CZUFT·Ͱ දݱͰ͖Δ 00:B0:00:00:FF -Fఆ͢Δσʔλ ''
00:B0:00:00:00:01:00 ֦ு-Fఆ͢Δσʔλ ''''
IUUQTTNBSUDBSEBUSBQEVGSQBSTF "53C
"53ʢ"54ʣมߋͰ͖ͳ͍ IUUQTEFWFMPQFSBOESPJEDPNHVJEFUPQJDTDPOOFDUJWJUZOGDIDF IMKB*TP%FQ"DU
ରࡦ )$&ΞϓϦɺCZUFTΛ͑Δ͞ͷσʔλΛૹ৴͠ͳ͍ ࠷େCZUFTͷνϟϯΫʹׂͯ͠ૹ৴͢Δ ϦʔμʔଆͷιϑτΣΞͰɺΧʔυଆ͕CZUFTΛ͑ΔσʔλΛऔΓѻ͑ͳ͍ ͜ͱΛલఏʹ։ൃ͢Δ ϦʔμʔͱΧʔυͷΈ߹Θͤجຊతʹ੍Ͱ͖ͳ͍
ड /'$ແઢ௨৴ͳͷͰडՄೳ ສԁఔͷػثͰ௨৴༰ΛडɺهͰ͖Δ ϦʔμʔɺΧʔυؒͰࣗಈతʹ҉߸Խ͞Εͳ͍ ҉߸Խͷํ๏ͱͯ͠4FDVSF.FTTBHJOH͕͋Δ 4FDVSF.FTTBHJOHݸผʹ࣮͢Δඞཁ͕͋ΓɺΧʔυଆ͚ͩͰͳ͘Ϧʔμʔ ଆରԠ͍ͯ͠Δඞཁ͕͋Δ
डͷରࡦ /'$Λ௨ͯ͡ΓͱΓ͢Δใɺͯ͢ड͞ΕΔલఏͰઃܭ͢Δ Ϧʔμʔଆ͔Β1*/ΛૹΔͱ͖ฏจͰૹ৴͠ͳ͍ ϦʔμʔଆͰ1*/Λೖྗ͠ͳ͍ʢΧʔυʹૹ৴͠ͳ͍ʣ εϚʔτϑΥϯʢΧʔυʣଆͰೝূΛٻΊΔͳͲɺεϚʔτϑΥϯͷಛੑΛ׆͔ ͨ͠ηΩϡϦςΟΛݕ౼͢Δ
ෳ डͱΈ߹ΘͤΔ͜ͱͰɺଞͷΞϓϦ͕)$&ͷԠ༰Λશʹ฿ͯ͠Ϋϩʔϯ ΧʔυʢΞϓϦʣΛ࡞͢Δ͜ͱ͕ٕज़తʹՄೳ Ϧʔμʔଆɺࣗͷ௨৴૬ख͕ෳ͞ΕͨͷͰͳ͍͔ఆ͢Δඞཁ͕͋Δ
Ϧʔμʔ "OESPJE "OESPJE,FZ4UPSF ιϑτΣΞ ిࢠॺ໊ʹΑΔෳݕ ΞϓϦʢ)$&ʣ ެ։ݤ ൿີݤ ެ։ݤ ॳظઃఆϦΫΤετ
ެ։ݤอଘ ݤϖΞੜ ݤϖΞੜϦΫΤετ /'$
Ϧʔμʔ "OESPJE "OESPJE,FZ4UPSF ιϑτΣΞ ిࢠॺ໊ʹΑΔෳݕ ΞϓϦʢ)$&ʣ ॺ໊ ൿີݤ ެ։ݤ ॺ໊ϦΫΤετ
ެ։ݤ ॺ໊ͷݕূ ిࢠॺ໊ ॺ໊ϦΫΤετ /'$
Ϧʔμʔͱͷ૬ੑ )$&ͷΞϓϦΛ1JYFM8BUDIʹΠϯετʔϧͨ͠ɻ 40/:ͷ1B4P3J3$44ʢۀ༻ʣͰಡΈऔΔ͜ͱ͕Ͱ͖Δ͕ɺ "EWBODFE$BSE4ZTUFNTͷ"$36Ͱਖ਼͘͠ಡΈऔΔ͜ͱ͕Ͱ͖ͳ͍έʔε ͕͋ͬͨʢݫີʹݴ͏ͱճʹճ͘Β͍ͷޭʣ
ϦʔμʔʹΑͬͯҟͳΔ௨৴ํࣜ ֬ೝͨ͠ͱ͜Ζɺ 40/:ͷ1B4P3J3$44ʢۀ༻ʣ/'$5ZQF"Ͱɺ "EWBODFE$BSE4ZTUFNTͷ"$36/'$5ZQF#ͰɺͦΕͧΕ௨৴͍ͯ͠ ͨʢ1JYFM8BUDIʹݶΒͣɺςετͨͯ͢͠Ͱಉ͡ʣɻ "$36ɺ1JYFMBͳͲͷܞଳͱͳ͘௨৴Ͱ͖͍ͯΔɻ 1JYFM8BUDIଆ͕ɺ5ZQF#Ͱͷ௨৴ʹ՝͕͋ΔՄೳੑ͕͋Δɻ
ΞϓϦଆ͔ΒͰ͖Δ͜ͱͳ͍ ɾϦʔμʔͷ૬ੑ͕ൃੜ͍ͯ͠Δ͜ͱɺΞϓϦ͔ΒΔ͜ͱ͕Ͱ͖ͳ͍ ͦͦ)PTU"QEV4FSWJDFʹ౸ୡ͠ͳ͍ͷͰɺϦʔμʔ͕௨৴ΛࢼΈ͍ͯΔ͜ ͱΛΞϓϦݕͰ͖ͳ͍ 5ZQF"ͰΞΫηε͢Δ͔ɺ5ZQF#ͰΞΫηε͢Δ͔Ϧʔμʔґଘ
Ϧʔμʔͱͷ૬ੑͷରԠ Λ(PPHMF1MBZͷ৴ର͔Βআ֎͢Δʁ ϦʔμʔͱͷΈ߹Θͤͷ ಈ࡞อূΛ͢ΔͱϦʔμʔͷΈ߹ΘͤΛެද͢Δʁ ύλʔϯരൃ ΞϓϦͷ࠷ॳʹνϡʔτϦΞϧΛ༻ҙɻͦͷաఔͰΛϦʔμʔͰಡΈऔͬͯΒ͏ɻ Ұఆ࣌ؒޭ͠ͳ͚Εࣦഊͱݟ၏ͯ͠૬ੑΛҊ͢Δ
ࠜຊతʹղܾ͍ͯ͠ͳ͍͚Ͳɺ͍͓͟͏ͱͯ͠μϝΑΓ͍͍
"HFOEB εϚʔτΧʔυͱ/'$ )PTUCBTFE$BSE&NVMBUJPOʢ)$&ʣ )$&Λ࣮͢Δ εϚʔτΧʔυΛࢧ͑Δن֨
)$&ͷམͱ݀͠ ·ͱΊ
)$&׆༻ͷظͱ՝ )PTUCBTFE$BSE&NVMBUJPOʢ)$&ʣΛ͏ͱɺ"OESPJEεϚʔτϑΥϯΛߴػೳͳεϚʔτ Χʔυͱͯ͠ৼΔΘͤΔ͜ͱ͕Ͱ͖Δɻ)$&ͷ׆༻ʹΑΓɺܾࡁͷΈͳΒͣɺެతͳূ໌ͱ͠ ͯͷϞόΠϧӡస໔ڐূͳͲ༻్ͷ֦େ͕ظͰ͖Δɻ ͔͠͠ͳ͕Βɺ)$&ʹগͳ͔Βͣ՝͕͋Δɻ·ͣɺ"OESPJEͷ)$&جຊతͳػೳͷΈఏڙ͠ ͍ͯΔɻͦͷͨΊଟ͘ͷ෦Λ։ൃऀ͕࣮ࣗ͢Δඞཁ͕͋Γɺ։ൃෛՙ͕ߴ͍ɻ ࣍ʹɺηΩϡϦςΟͷݕ౼͕ෆेͰ͋ͬͨ߹ɺडʹΑΔใ࿙ӮɺΫϩʔϯΧʔυͷ࡞ͳ ͲɺγεςϜͷ҆શੑʹॏେͳӨڹΛͨΒ͢Մೳੑ͕͋Δɻ·ͨɺΞϓϦ͔ΒઃఆͰ͖ͳ͍߲͕ ଟ͘ɺͱϦʔμʔͱͷΈ߹ΘͤͰಈ࡞͠ͳ͍ͳͲɺΞϓϦͰղܾ͕͍͠՝͋Δɻ)$& ͷಋೖʹ͋ͨͬͯɺϢʔβʔʹͲͷΑ͏ʹαϙʔτ͢Δ͔ेʹݕ౼ɾ४උ͢Δඞཁ͕͋Δɻ
ຊࢿྉ༗ࢁܓೋͷஶ࡞Ͱ͢ɻຊࢿྉͷશ෦ɺ·ͨҰ෦ʹ͍ͭͯɺஶ࡞ऀ͔ΒจॻʹΑΔڐΛಘͣʹෳ͢Δ͜ͱې͡ΒΕ͍ͯ·͢ɻ ໊֤ɾϒϥϯυ໊ɺձ໊ࣾͳͲɺҰൠʹ֤ࣾͷඪ·ͨొඪͰ͢ɻຊࢿྉதͰɺɺɺäΛׂѪ͍ͯ͠·͢ɻ ຊࢿྉͷ༰ɺൃදऀݸਓͷݟղͰ͋Γɺॴଐ·ͨؔ༩͢Δ৫Λද͢ΔͷͰ͋Γ·ͤΜɻ ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠
ࢀߟ w ߞӍಡϚΠφϯόʔΧʔυͱ"1%6Ͱ௨৴ͯ͠ॺ໊σʔλ࡞ w IUUQTUFYFHJUIVCJPCMPHQSPUPDPMKQLJNZOVNCFSDBSEXJUIBQEV w 4NBSU$BSE(VZ w IUUQTTNBSUDBSEHVZIBUFOBCMPHKQ w
&5'MBC,OPXMFEHFCBTF w IUUQTXXXFGUMBCDPNLOPXMFEHFCBTF w ࡏཹΧʔυಡΈऔΓ༷ॻʢҰൠެ։༻ʣW w IUUQTXXXNPKHPKQJTBDPOUFOUQEG
ࢀߟ w ӡస໔ڐূٴͼӡస໔ڐূ࡞γεςϜ༷ॻʢ༷ॻόʔδϣϯ൪߸ɿ w IUUQTXXXOQBHPKQMBXTOPUJ fi DBUJPOLPVUVVNFOLZPNFOLZP@QEG w 'VODUJPOBM4QFDJ
fi DBUJPOPGUIF0QFO1(1BQQMJDBUJPOPO*404NBSU$BSE 0QFSBUJOH4ZTUFNT w IUUQTHOVQHPSHGUQTQFDT0QFO1(1TNBSUDBSEBQQMJDBUJPOQEG w *$"0%PD.BDIJOF3FBEBCMF5SBWFM%PDVNFOU w IUUQTXXXJDBPJOUQVCMJDBUJPOTQBHFTQVCMJDBUJPOBTQY EPDOVN