Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

iOS NFCReader切り出し対応(APDUコマンド切り出し) #1

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
12 changes: 11 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,17 @@ class ViewController: UIViewController, DriversLicenseReaderSessionDelegate {
- Item 2: `D3921000310001010100`
- Item 3: `D3921000310001010401`

2. ライブラリをインポートし、`IndividualNumberReader` を初期化した後でスキャンを開始する。

2. マイナンバーカードの電子証明書を読み取るには、開発している iOS Application の Info.plist に 以下を追加する。 指定する値については接続するプラットフォーム事業者へ問い合わせる。
- userAuthenticationPin
- userAuthenticationPrivate
- userAuthenticationCertificate
- digitalSignaturePin
- digitalSignaturePrivate
- digitalSignatureCertificate
- computeDigitalSignature

3. ライブラリをインポートし、`IndividualNumberReader` を初期化した後でスキャンを開始する。
```swift
import UIKit
import TRETJapanNFCReader
Expand Down
15 changes: 15 additions & 0 deletions Sources/MIFARE/IndividualNumber/IndividualNumberCard.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,14 @@ public enum IndividualNumberCardItem: CaseIterable {
case tokenInfo
/// マイナンバー
case individualNumber
/// 利用者証明用電子証明書
case userAuthenticationCertificate
/// 署名用電子証明書
case digitalSignatureCertificate
/// 電子署名生成(利用者証明用電子証明書)
case computeDigitalSignatureForUserAuthentication
/// 電子署名生成(署名用電子証明書)
case computeDigitalSignatureForDigitalSignature
}

public enum IndividualNumberCardApplication: CaseIterable {
Expand All @@ -30,6 +38,13 @@ public enum IndividualNumberCardApplication: CaseIterable {
case basicResidentRegistrationApplication
}

public enum IndividualNumberCardSignatureType: CaseIterable {
/// 利用者証明用電子証明書
case userAuthentication
/// 署名用電子証明書
case digitalSignature
}

/// マイナンバーカード
@available(iOS 13.0, *)
public struct IndividualNumberCard {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,12 @@ public struct IndividualNumberCardData {
public var token: String?
/// マイナンバー
public var individualNumber: String?
/// 利用者証明用電子証明書
public var userAuthenticationCertificate: [UInt8]?
/// 署名用電子証明書
public var digitalSignatureCertificate: [UInt8]?
/// 電子署名(利用者証明用電子証明書)
public var computeDigitalSignatureForUserAuthentication: [UInt8]?
/// 電子署名(署名用電子証明書)
public var computeDigitalSignatureForDigitalSignature: [UInt8]?
}
37 changes: 36 additions & 1 deletion Sources/MIFARE/IndividualNumber/IndividualNumberReader.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,12 @@ public class IndividualNumberReader: MiFareReader {

internal let delegate: IndividualNumberReaderSessionDelegate?
private var items: [IndividualNumberCardItem] = []

private var computeDigitalSignatureType: IndividualNumberCardSignatureType?
private var userAuthenticationPIN: [UInt8] = []
private var digitalSignaturePIN: [UInt8] = []
private var dataToSignForUserAuthentication: [UInt8] = []
private var userAuthenticationSignData: [UInt8] = []
private var digitalSignatureSignData: [UInt8] = []
private var cardInfoInputSupportAppPIN: [UInt8] = []

private var lookupRemainingPINType: IndividualNumberCardPINType?
Expand Down Expand Up @@ -57,6 +62,28 @@ public class IndividualNumberReader: MiFareReader {
self.beginScanning()
}

public func computeDigitalSignature(signatureType:IndividualNumberCardSignatureType, pin: String = "", dataToSign: [UInt8]) {
self.computeDigitalSignatureType = signatureType
var items: [IndividualNumberCardItem] = []

switch self.computeDigitalSignatureType! {
case .userAuthentication:
if let userAuthenticationPIN = pin.data(using: .utf8) {
self.userAuthenticationPIN = [UInt8](userAuthenticationPIN)
}
items = [IndividualNumberCardItem.userAuthenticationCertificate, IndividualNumberCardItem.computeDigitalSignatureForUserAuthentication]
self.userAuthenticationSignData = dataToSign
case .digitalSignature:
if let digitalSignaturePIN = pin.data(using: .utf8) {
self.digitalSignaturePIN = [UInt8](digitalSignaturePIN)
}
items = [IndividualNumberCardItem.digitalSignatureCertificate, IndividualNumberCardItem.computeDigitalSignatureForDigitalSignature]
self.digitalSignatureSignData = dataToSign
}

self.get(items: items)
}

private func beginScanning() {
guard self.checkReadingAvailable() else {
print("""
Expand Down Expand Up @@ -177,6 +204,14 @@ public class IndividualNumberReader: MiFareReader {
individualNumberCard = self.readJPKIToken(session, individualNumberCard)
case .individualNumber:
individualNumberCard = self.readIndividualNumber(session, individualNumberCard, cardInfoInputSupportAppPIN: self.cardInfoInputSupportAppPIN)
case .userAuthenticationCertificate:
individualNumberCard = self.getUserAuthenticationCertificate(session, individualNumberCard)
case .digitalSignatureCertificate:
individualNumberCard = self.getDigitalSignatureCertificate(session, individualNumberCard, digitalSignaturePIN: self.digitalSignaturePIN)
case .computeDigitalSignatureForUserAuthentication:
individualNumberCard = self.computeDigitalSignatureForUserAuthentication(session, individualNumberCard, userAuthenticationPIN: self.userAuthenticationPIN, dataToSign: self.userAuthenticationSignData)
case .computeDigitalSignatureForDigitalSignature:
individualNumberCard = self.computeDigitalSignatureForDigitalSignature(session, individualNumberCard, digitalSignaturePIN: self.digitalSignaturePIN, dataToSign: self.digitalSignatureSignData)
}
}
completion(individualNumberCard)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
#if os(iOS)
import CoreNFC

var apduComputeDigitalSignature:String = Bundle.main.object(forInfoDictionaryKey: "computeDigitalSignature") as! String

@available(iOS 13.0, *)
extension IndividualNumberReader {

Expand Down Expand Up @@ -47,6 +49,13 @@ extension IndividualNumberReader {
let data = IndividualNumberCardAID.cardInfoInputSupportAP
self.selectDF(tag: tag, data: data, completionHandler: completionHandler)
}

internal func computeDigitalSignature(tag: IndividualNumberCardTag, expectedResponseLength: Int, dataToSign: [UInt8], completionHandler: @escaping IndividualNumberReaderCompletionHandler) {
let computeDigitalSignature = self.getHexNum(hexString: apduComputeDigitalSignature)
let apdu = NFCISO7816APDU(instructionClass: 0x80, instructionCode: 0x2A, p1Parameter: computeDigitalSignature.upper, p2Parameter: computeDigitalSignature.lower, data: Data(dataToSign), expectedResponseLength: expectedResponseLength)

tag.sendCommand(apdu: apdu, completionHandler: completionHandler)
}
}

internal enum IndividualNumberCardAID {
Expand Down
Loading