Slide 1

Slide 1 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. マイナンバーカードに2日で対応、 4日でリリースした記録 @treastrain | @JapanNFCReader 1 NEW DEBUG!! ~転職してプログラマーになったら一切エラーがでないんだが~ @ CASPUR May 17, 2020

Slide 2

Slide 2 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. 2 自己紹介 @treastrain / Tanaka Ryoga https://treastrain.jp 高専卒 → 大学学部4年 → 21新卒予定 Swift (iOS, watchOS), Core NFC 2019年9月22日 iOS・watchOS App 「Japan NFC Reader」リリース

Slide 3

Slide 3 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. Japan NFC Reader iOS 13.0 以降の iPhone で 電子マネーの残高・利用履歴の読み取り iPhone で読み取った履歴を iCloud 経由で他のデバイスから確認できる https://japannfcreader.tret.jp/ Twitter @JapanNFCReader 3 iOS App

Slide 4

Slide 4 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. treastrain/TRETJapanNFCReader https://github.com/treastrain/TRETJapanNFCReader Japan NFC Reader のコア部分を OSS 化したライブラリ MIT Licence Initial commit: 2019年6月19日 265 Stars 2020年5月16日時点 (複数の企業の社内 Wiki? or Slack? からのアクセスログも…) 4 OSS Library

Slide 5

Slide 5 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. TRETJapanNFCReader の対応カード 2020年5月16日時点 NFC-F (FeliCa®) ● 交通系IC(10カード + それと同仕様のもの) ● 地方交通系IC(りゅーと) ● 楽天Edy、nanaco、WAON ● OKICA ● 大学生協ICプリペイド ● 八達通 - Octopus 5

Slide 6

Slide 6 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. TRETJapanNFCReader の対応カード ● ICカード運転免許証 ○ 運転免許証の券面+本籍を読み取れる (氏名、住所、生年月日、免許の年月日、写真…) ○ 読み取りには交付時に自分で設定した暗証番号が必要 ○ 日常生活で読み取りを必要とする場面はほとんどない ○ 仕様は警察庁交通局から公開されている ○ ISO/IEC 14443 Type B (JIS X 6301) に準拠 ⇒ NFC-B 6

Slide 7

Slide 7 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. 本題 7

Slide 8

Slide 8 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. 8

Slide 9

Slide 9 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. マイナンバーカードの パスワードが分からない 9

Slide 10

Slide 10 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. 個人番号カード(マイナンバーカード) ● 「パスワードは忘れてはいけない」……けど ● マイナンバーカードには4つのアプリが入っている ことになっている 10

Slide 11

Slide 11 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. マイナンバーカード 4つのアプリ ● 署名用電子証明書(公的個人認証 署名用) ● 利用者証明電子証明書(公的個人認証 利用者証明用) ● 券面事項入力補助用 ● 個人番号カード用(住民基本台帳事務用) 11

Slide 12

Slide 12 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. ● 署名用電子証明書(公的個人認証 署名用) ○ 6〜16字、英大文字と数字を組み合わせる 5回試行可能 ● 利用者証明電子証明書(公的個人認証 利用者証明用) ○ 4桁の数字 3回試行可能 ● 券面事項入力補助用 ○ 4桁の数字 3回試行可能 ● 個人番号カード用(住民基本台帳事務用) ○ 4桁の数字 3回試行可能 マイナンバーカード 4つのアプリ パスワード 12 同じでもOK

Slide 13

Slide 13 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. ● 署名用電子証明書(公的個人認証 署名用) ○ 6〜16字、英大文字と数字を組み合わせる 5回試行可能 ● 利用者証明電子証明書(公的個人認証 利用者証明用) ○ 4桁の数字 3回試行可能 ● 券面事項入力補助用 ○ 4桁の数字 3回試行可能 ● 個人番号カード用(住民基本台帳事務用) ○ 4桁の数字 3回試行可能 マイナンバーカード 4つのアプリ パスワード 13 同じでもOK ⬅ 今回 求められて いるもの ⬅

Slide 14

Slide 14 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. ● 署名用電子証明書(公的個人認証 署名用) ○ 6〜16字、英大文字と数字を組み合わせる 5回試行可能 ● 利用者証明電子証明書(公的個人認証 利用者証明用) ○ 4桁の数字 3回試行可能 ● 券面事項入力補助用 ○ 4桁の数字 3回試行可能 ● 個人番号カード用(住民基本台帳事務用) ○ 4桁の数字 3回試行可能 マイナンバーカード 4つのアプリ パスワード 14 ⬅ 今回 求められて いるもの ⬅ 同じでもOK

Slide 15

Slide 15 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. 試行回数をオーバーするとロックされる (役所に行ってロック解除しないといけない) 15

Slide 16

Slide 16 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. せめて残りの 試行回数だけでも 分かれば… 16

Slide 17

Slide 17 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. @GOROman さんのツイート 17 GOROman @GOROman マイナンバーカードは対応してなかったけど、非常に参考になりました。 -- 日本の NFC、FeliCa カード向けリーダーライブラリ(iOS 13.0 以降) https://github.com/treastrain/TRETJapanNFCReader 午前3:29・2020年5月9日・Twitter Web App

Slide 18

Slide 18 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. ライブラリが紹介されている… ● マイナンバーカードはICカード運転免許証と同じ NFC-B ● NFC 通信のコマンドは同じ ISO/IEC 7816-4 ● 私が持っていないので対応作業をしていなかった ● @GOROman さんがマイナンバーカードで遊んでいる… ● 楽しそう…… ⇒ 祖母からマイナンバーカードを借りて、 ライブラリだけでも対応しよう…! 18

Slide 19

Slide 19 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. TRETJapanNFCReader の マイナンバーカード対応 19

Slide 20

Slide 20 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. ISO/IEC 7816-4 データの構造 ● MF - Master File - 主ファイル ○ ルートのようなイメージ ● DF - Dedicated File - 専用ファイル ○ ディレクトリのようなイメージ ● EF - Elementary File - 基礎ファイル ○ ファイルのようなイメージ 20

Slide 21

Slide 21 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. 処理のイメージ 21 MF を指定 DF を指定 EF を指定 処理

Slide 22

Slide 22 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. パスワード残り試行回数取得のイメージ 22 DF を指定 EF を指定 処理 アプリの個数分(4回)繰り返す

Slide 23

Slide 23 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. NFCISO7816Tag .sendCommand(apdu:completionHandler:) ● Core NFC - iOS 13.0 以降 ● ISO 7816 タグにコマンドを送るときに使う ● apdu に Application Protocol Data Unit を指定 ● 完了後、completionHandler が呼ばれる 非同期 ○ 何度も繰り返すとなるとコールバック・ネスト地獄に陥る 23

Slide 24

Slide 24 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. コールバック・ネスト地獄 ● DispatchSemaphore で 同期処理に変えてしまうのがいい ● システムによるアラートが表示されているので、 ユーザーはキャンセル以外の操作ができない 24

Slide 25

Slide 25 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. treastrain/TRETJapanNFCReader の場合 毎度 NFCISO7816APDU を書かなくていいように 各コマンドを作っておく 25

Slide 26

Slide 26 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. verify の pin には何も入れない verify(tag: detectedTag, pin: [], /// 何も入れない // ... ) 26 ● VERIFY コマンドのデータ部 (= APDUのデータ部)には 空の [UInt8] を指定 ● 残り試行回数が 分かるようになる

Slide 27

Slide 27 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. 状態バイト(SW1-SW2) ● SW1 ○ 0x90(正常終了) ○ 0x63(警告) ● 0x63 のときの SW2 ○ 0xCX(X に残り回数) ● verify で pin を指定しないと SW1 は 0x63 になる ● SW2 に残り回数の情報が 含まれる ○ 0xC3 ⇒ 残り3回 let remaining = Int(sw2 & 0x0F) 27

Slide 28

Slide 28 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. マイナンバーカード(一部の機能)に対応! 28 treastrain / Tanaka Ryoga @treastrain TRETJapanNFCReader のマイナンバーカード対応を行いました。 今のところはマイナンバーの取得のみとなっていて、master には上がっていま すが内部処理の破壊的変更が行われる可能性は大きいです。 https://github.com/treastrain/TRETJapanNFCReader 午後6:13・2020年5月11日・TweetDeck

Slide 29

Slide 29 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. @GOROman さんのツイート 29 GOROman @GOROman ストア版のアプリにこの機能が付いたら助かる人増えそうですね。 午前3:29・2020年5月12日・Twitter for iPhone

Slide 30

Slide 30 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. GO サインが出た 30

Slide 31

Slide 31 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. App の方にも実装 ● ライブラリに対応する作業 ● 注意事項や各パスワードの説明を書いた ● 5/13 1:00 完成 そのときのツイート ● 2:43 App Store Connect に提出 ● 2:48 Waiting for Review ● 5:57 In Review ● 8:53 Pending Developer Release ● 10:12 Ver 1.0.5 Approved for the App Store 31

Slide 32

Slide 32 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. リリース! 32 Japan NFC Reader - iPhone で電子マネーの残高チェック @JapanNFCReader 【Ver 1.0.5 アップデート】 App Store にて Ver 1.0.5 のアップデートが配信開始されました。 運転免許証の暗証番号1、マイナンバーカードのパスワードの残り試行回数を確 認できるようになりました。 詳しくは添付の画像およびこのツイートに続くスレッドをご確認ください。 午後0:01・2020年5月13日・TweetDeck

Slide 33

Slide 33 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. 総括 ● みんなもマイナンバーカードで遊ぼう ● 対応済みのICカード運転免許証のコードを流用できた ○ 公的書類に関するリリースは少し怖いが、 検証済みのコードがあったから早めの対応ができた ○ キャッチアップ・アウトプットは大事 ● Swift → Java/Kotlin に 翻訳できる方、Android 版をお待ちしています 33

Slide 34

Slide 34 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. おまけ ● App・OSSライブラリ 使ってください ください https://japannfcreader.tret.jp/ https://github.com/treastrain/TRETJapanNFCReader ● ライブラリの使い方(パスワード残り試行回数取得方法)について Qrunch で公開しています ください マイナンバーカードのパスワード残り試行回数を調べる | Qrunch(クランチ) 34

Slide 35

Slide 35 text

Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. 謝辞 ● JIS X 6320-4:2017(ISO/IEC 7816-4:2013) ○ 日本産業標準調査会:データベース にて閲覧 ● treastrain/TRETJapanNFCReader の README ● Special Thanks ○ @GOROman さん - 機会の提供・モチベーション ○ @k_katsumi さん - SwiftPM に関する情報&プルリク ○ App のユーザーのみなさん、ライブラリの Stargazers 35