@vppos/react-native-nfc 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -0
- package/NFCSDK.podspec +40 -0
- package/android/build.gradle +85 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +31 -0
- package/android/src/main/AndroidManifestNew.xml +30 -0
- package/android/src/main/java/com/nfcsdk/ChipReader.kt +237 -0
- package/android/src/main/java/com/nfcsdk/NFCSDKModule.kt +78 -0
- package/android/src/main/java/com/nfcsdk/NFCSDKPackage.kt +17 -0
- package/android/src/main/java/com/nfcsdk/NFCScanActivity.kt +299 -0
- package/android/src/main/java/com/nfcsdk/utils/Dg13Parser.kt +278 -0
- package/android/src/main/java/com/nfcsdk/utils/FaceExtractor.kt +40 -0
- package/android/src/main/java/com/nfcsdk/utils/MrzUtils.kt +75 -0
- package/android/src/main/res/drawable/bg_nfc_bottom_sheet.xml +13 -0
- package/android/src/main/res/drawable/bg_nfc_sheet_handle.xml +9 -0
- package/android/src/main/res/layout/activity_nfc.xml +110 -0
- package/android/src/main/res/values/styles.xml +10 -0
- package/android/src/main/res/xml/nfc_tech_filter.xml +8 -0
- package/ios/ChipReader.swift +258 -0
- package/ios/NFCSDK-Bridging-Header.h +2 -0
- package/ios/NFCSDK.mm +9 -0
- package/ios/NFCSDK.swift +112 -0
- package/ios/NFCSDKSession.swift +5 -0
- package/ios/utils/DG13Parser.swift +302 -0
- package/ios/utils/MrzUtils.swift +49 -0
- package/lib/module/errors.js +9 -0
- package/lib/module/errors.js.map +1 -0
- package/lib/module/index.js +118 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/errors.d.ts +4 -0
- package/lib/typescript/src/errors.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +80 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +45 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/package.json +155 -0
- package/src/errors.ts +6 -0
- package/src/index.tsx +141 -0
- package/src/types.ts +45 -0
- package/vendor/ios-passport-reader/CHANGELOG +362 -0
- package/vendor/ios-passport-reader/CODE_OF_CONDUCT.md +77 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/AppDelegate.swift +39 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/Contents.json +158 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-40.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-72.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-72@2x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-76.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-small-50.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-small-50@2x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-small.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-small@2x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-small@3x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon@2x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/ios-marketing.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/notification-icon@2x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/notification-icon@3x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/notification-icon~ipad.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/notification-icon~ipad@2x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/Contents.json +6 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/background.imageset/Contents.json +21 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/background.imageset/background.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/head.imageset/Contents.json +21 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/head.imageset/head.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Base.lproj/LaunchScreen.storyboard +25 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Extensions/FileManagerExt.swift +16 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Extensions/StringExt.swift +40 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Extensions/UIApplicationExt.swift +21 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Info.plist +77 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Model/PassportUtils.swift +76 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Model/SettingsStore.swift +107 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/NFCPassportReader.entitlements +10 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/SceneDelegate.swift +57 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/DetailsView.swift +197 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/ExportPassportView.swift +164 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/HelperViews/CheckBoxView.swift +48 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/HelperViews/ViewExt.swift +20 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/HelperViews/ViewModifiers.swift +41 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/MRZEntryView.swift +125 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/MRZScannerViewController.swift +90 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/MainView.swift +214 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/PassportSummaryView.swift +111 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/PassportView.swift +73 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/SettingsView.swift +63 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/StoredPassportView.swift +152 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/masterList.pem +32 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/readme.md +10 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp.xcodeproj/project.pbxproj +695 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp.xcodeproj/xcshareddata/xcschemes/NFCPassportReader.xcscheme +106 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp.xcworkspace/contents.xcworkspacedata +10 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +8 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderAppTests/DataGroupParsingTests.swift +189 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderAppTests/Info.plist +22 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderAppTests/NFCPassportReaderTests.swift +260 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderAppTests/PACETests.swift +112 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/Podfile +22 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/Podfile.lock +35 -0
- package/vendor/ios-passport-reader/Examples/Example_CocoaPods/README.md +2 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/AppDelegate.swift +39 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/Contents.json +158 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-40.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-72.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-72@2x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-76.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-small-50.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-small-50@2x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-small.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-small@2x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-small@3x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon@2x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/ios-marketing.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/notification-icon@2x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/notification-icon@3x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/notification-icon~ipad.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/notification-icon~ipad@2x.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/Contents.json +6 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/background.imageset/Contents.json +21 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/background.imageset/background.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/head.imageset/Contents.json +21 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/head.imageset/head.png +0 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Base.lproj/LaunchScreen.storyboard +25 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Extensions/FileManagerExt.swift +16 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Extensions/StringExt.swift +40 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Extensions/UIApplicationExt.swift +21 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Info.plist +79 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Model/PassportUtils.swift +99 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Model/SettingsStore.swift +98 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Model/SettingsStoreCAN.swift +75 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/MrzScanner/LICENSE +21 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/MrzScanner/PreviewView.swift +34 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/MrzScanner/StringUtils.swift +160 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/MrzScanner/ViewController.swift +320 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/MrzScanner/VisionViewController.swift +163 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/NFCPassportReader.entitlements +10 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/SceneDelegate.swift +58 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/CANViews/CanKeyView.swift +251 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/CANViews/MRZEntryViewCanKey.swift +65 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/CANViews/PassportViewCAN.swift +73 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/DetailsView.swift +193 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/ExportPassportView.swift +164 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/HelperViews/CheckBoxView.swift +48 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/HelperViews/ViewExt.swift +20 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/HelperViews/ViewModifiers.swift +41 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/MRZEntryView.swift +125 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/MRZScannerViewController.swift +90 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/MainView.swift +264 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/PassportSummaryView.swift +111 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/PassportView.swift +73 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/SettingsView.swift +47 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/StoredPassportView.swift +149 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/masterList.pem +32 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/readme.md +10 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp.xcodeproj/project.pbxproj +683 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +25 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp.xcodeproj/xcshareddata/xcschemes/NFCPassportReader.xcscheme +106 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderAppTests/DataGroupParsingTests.swift +190 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderAppTests/Info.plist +22 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderAppTests/NFCPassportReaderTests.swift +260 -0
- package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderAppTests/PACETests.swift +112 -0
- package/vendor/ios-passport-reader/LICENSE +21 -0
- package/vendor/ios-passport-reader/NFCPassportReader.podspec +27 -0
- package/vendor/ios-passport-reader/Package.swift +29 -0
- package/vendor/ios-passport-reader/README.md +141 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/AES_3DES_DESEncryption.swift +377 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/BACHandler.swift +194 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/ChipAuthenticationHandler.swift +224 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroupHash.swift +16 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroupParser.swift +36 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/ActiveAuthenticationInfo.swift +69 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/COM.swift +61 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/CardAccess.swift +38 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/ChipAuthenticationInfo.swift +135 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/ChipAuthenticationPublicKeyInfo.swift +53 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/DataGroup.swift +103 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/DataGroup1.swift +111 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/DataGroup11.swift +66 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/DataGroup12.swift +75 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/DataGroup14.swift +37 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/DataGroup15.swift +46 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/DataGroup2.swift +163 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/DataGroup7.swift +46 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/DataGroupId.swift +105 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/NotImplementedDG.swift +16 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/PACEInfo.swift +415 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/SOD.swift +240 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/SecurityInfo.swift +136 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/Errors.swift +148 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/Logging.swift +32 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/Models/FaceImageInfo.swift +161 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/NFCPassportModel.swift +540 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/NFCViewDisplayMessage.swift +60 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/OpenSSLUtils.swift +705 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/PACEHandler.swift +627 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/PassportReader.swift +387 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/Resources/PrivacyInfo.xcprivacy +14 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/ResponseAPDU.swift +25 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/SecureMessaging.swift +301 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/SecureMessagingSessionKeyGenerator.swift +156 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/SimpleASN1DumpParser.swift +173 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/TagReader.swift +374 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/Utils.swift +430 -0
- package/vendor/ios-passport-reader/Sources/NFCPassportReader/X509Wrapper.swift +168 -0
- package/vendor/ios-passport-reader/scripts/README.md +45 -0
- package/vendor/ios-passport-reader/scripts/extract.py +197 -0
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
//
|
|
2
|
+
// PassportReader.swift
|
|
3
|
+
// NFCTest
|
|
4
|
+
//
|
|
5
|
+
// Created by Andy Qua on 11/06/2019.
|
|
6
|
+
// Copyright © 2019 Andy Qua. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
import Foundation
|
|
10
|
+
import OSLog
|
|
11
|
+
|
|
12
|
+
#if !os(macOS)
|
|
13
|
+
import UIKit
|
|
14
|
+
import CoreNFC
|
|
15
|
+
|
|
16
|
+
@available(iOS 15, *)
|
|
17
|
+
public class PassportReader : NSObject {
|
|
18
|
+
private typealias NFCCheckedContinuation = CheckedContinuation<NFCPassportModel, Error>
|
|
19
|
+
private var nfcContinuation: NFCCheckedContinuation?
|
|
20
|
+
|
|
21
|
+
private var passport : NFCPassportModel = NFCPassportModel()
|
|
22
|
+
|
|
23
|
+
private var readerSession: NFCTagReaderSession?
|
|
24
|
+
private var currentlyReadingDataGroup : DataGroupId?
|
|
25
|
+
|
|
26
|
+
private var dataGroupsToRead : [DataGroupId] = []
|
|
27
|
+
private var readAllDatagroups = false
|
|
28
|
+
private var skipSecureElements = true
|
|
29
|
+
private var skipCA = false
|
|
30
|
+
private var skipPACE = false
|
|
31
|
+
private var useExtendedMode = false
|
|
32
|
+
|
|
33
|
+
private var bacHandler : BACHandler?
|
|
34
|
+
private var caHandler : ChipAuthenticationHandler?
|
|
35
|
+
private var paceHandler : PACEHandler?
|
|
36
|
+
private var canKey : String = ""
|
|
37
|
+
private var dataAmountToReadOverride : Int? = nil
|
|
38
|
+
|
|
39
|
+
private var scanCompletedHandler: ((NFCPassportModel?, NFCPassportReaderError?)->())!
|
|
40
|
+
private var nfcViewDisplayMessageHandler: ((NFCViewDisplayMessage) -> String?)?
|
|
41
|
+
private var masterListURL : URL?
|
|
42
|
+
private var shouldNotReportNextReaderSessionInvalidationErrorUserCanceled : Bool = false
|
|
43
|
+
|
|
44
|
+
// By default, Passive Authentication uses the new RFS5652 method to verify the SOD, but can be switched to use
|
|
45
|
+
// the previous OpenSSL CMS verification if necessary
|
|
46
|
+
public var passiveAuthenticationUsesOpenSSL : Bool = false
|
|
47
|
+
|
|
48
|
+
public init( masterListURL: URL? = nil ) {
|
|
49
|
+
super.init()
|
|
50
|
+
|
|
51
|
+
self.masterListURL = masterListURL
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
public func setMasterListURL( _ masterListURL : URL ) {
|
|
55
|
+
self.masterListURL = masterListURL
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// This function allows you to override the amount of data the TagReader tries to read from the NFC
|
|
59
|
+
// chip. NOTE - this really shouldn't be used for production but is useful for testing as different
|
|
60
|
+
// passports support different data amounts.
|
|
61
|
+
// It appears that the most reliable is 0xA0 (160 chars) but some will support arbitary reads (0xFF or 256)
|
|
62
|
+
public func overrideNFCDataAmountToRead( amount: Int ) {
|
|
63
|
+
dataAmountToReadOverride = amount
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public func readPassport( canKey : String, tags : [DataGroupId] = [], skipSecureElements : Bool = true, skipCA : Bool = false, skipPACE : Bool = false, useExtendedMode : Bool = false, customDisplayMessage : ((NFCViewDisplayMessage) -> String?)? = nil) async throws -> NFCPassportModel {
|
|
67
|
+
|
|
68
|
+
self.passport = NFCPassportModel()
|
|
69
|
+
self.canKey = canKey
|
|
70
|
+
self.skipCA = skipCA
|
|
71
|
+
self.skipPACE = skipPACE
|
|
72
|
+
self.useExtendedMode = useExtendedMode
|
|
73
|
+
|
|
74
|
+
self.dataGroupsToRead.removeAll()
|
|
75
|
+
self.dataGroupsToRead.append( contentsOf:tags)
|
|
76
|
+
self.nfcViewDisplayMessageHandler = customDisplayMessage
|
|
77
|
+
self.skipSecureElements = skipSecureElements
|
|
78
|
+
self.currentlyReadingDataGroup = nil
|
|
79
|
+
self.bacHandler = nil
|
|
80
|
+
self.caHandler = nil
|
|
81
|
+
self.paceHandler = nil
|
|
82
|
+
|
|
83
|
+
// If no tags specified, read all
|
|
84
|
+
if self.dataGroupsToRead.count == 0 {
|
|
85
|
+
// Start off with .COM, will always read (and .SOD but we'll add that after), and then add the others from the COM
|
|
86
|
+
self.dataGroupsToRead.append(contentsOf:[.COM, .SOD] )
|
|
87
|
+
self.readAllDatagroups = true
|
|
88
|
+
} else {
|
|
89
|
+
// We are reading specific datagroups
|
|
90
|
+
self.readAllDatagroups = false
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
guard NFCNDEFReaderSession.readingAvailable else {
|
|
94
|
+
throw NFCPassportReaderError.NFCNotSupported
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if NFCTagReaderSession.readingAvailable {
|
|
98
|
+
readerSession = NFCTagReaderSession(pollingOption: [.iso14443], delegate: self, queue: nil)
|
|
99
|
+
|
|
100
|
+
self.updateReaderSessionMessage( alertMessage: NFCViewDisplayMessage.requestPresentPassport )
|
|
101
|
+
readerSession?.begin()
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return try await withCheckedThrowingContinuation({ (continuation: NFCCheckedContinuation) in
|
|
105
|
+
self.nfcContinuation = continuation
|
|
106
|
+
})
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
@available(iOS 15, *)
|
|
111
|
+
extension PassportReader : NFCTagReaderSessionDelegate {
|
|
112
|
+
// MARK: - NFCTagReaderSessionDelegate
|
|
113
|
+
public func tagReaderSessionDidBecomeActive(_ session: NFCTagReaderSession) {
|
|
114
|
+
// If necessary, you may perform additional operations on session start.
|
|
115
|
+
// At this point RF polling is enabled.
|
|
116
|
+
Logger.passportReader.debug( "tagReaderSessionDidBecomeActive" )
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
public func tagReaderSession(_ session: NFCTagReaderSession, didInvalidateWithError error: Error) {
|
|
120
|
+
// If necessary, you may handle the error. Note session is no longer valid.
|
|
121
|
+
// You must create a new session to restart RF polling.
|
|
122
|
+
Logger.passportReader.debug( "tagReaderSession:didInvalidateWithError - \(error.localizedDescription)" )
|
|
123
|
+
self.readerSession?.invalidate()
|
|
124
|
+
self.readerSession = nil
|
|
125
|
+
|
|
126
|
+
if let readerError = error as? NFCReaderError, readerError.code == NFCReaderError.readerSessionInvalidationErrorUserCanceled
|
|
127
|
+
&& self.shouldNotReportNextReaderSessionInvalidationErrorUserCanceled {
|
|
128
|
+
|
|
129
|
+
self.shouldNotReportNextReaderSessionInvalidationErrorUserCanceled = false
|
|
130
|
+
} else {
|
|
131
|
+
var userError = NFCPassportReaderError.UnexpectedError
|
|
132
|
+
if let readerError = error as? NFCReaderError {
|
|
133
|
+
Logger.passportReader.error( "tagReaderSession:didInvalidateWithError - Got NFCReaderError - \(readerError.localizedDescription)" )
|
|
134
|
+
switch (readerError.code) {
|
|
135
|
+
case NFCReaderError.readerSessionInvalidationErrorUserCanceled:
|
|
136
|
+
Logger.passportReader.error( " - User cancelled session" )
|
|
137
|
+
userError = NFCPassportReaderError.UserCanceled
|
|
138
|
+
default:
|
|
139
|
+
Logger.passportReader.error( " - some other error - \(readerError.localizedDescription)" )
|
|
140
|
+
userError = NFCPassportReaderError.UnexpectedError
|
|
141
|
+
}
|
|
142
|
+
} else {
|
|
143
|
+
Logger.passportReader.error( "tagReaderSession:didInvalidateWithError - Received error - \(error.localizedDescription)" )
|
|
144
|
+
}
|
|
145
|
+
nfcContinuation?.resume(throwing: userError)
|
|
146
|
+
nfcContinuation = nil
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
public func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {
|
|
151
|
+
Logger.passportReader.debug( "tagReaderSession:didDetect - found \(tags)" )
|
|
152
|
+
if tags.count > 1 {
|
|
153
|
+
Logger.passportReader.debug( "tagReaderSession:more than 1 tag detected! - \(tags)" )
|
|
154
|
+
|
|
155
|
+
let errorMessage = NFCViewDisplayMessage.error(.MoreThanOneTagFound)
|
|
156
|
+
self.invalidateSession(errorMessage: errorMessage, error: NFCPassportReaderError.MoreThanOneTagFound)
|
|
157
|
+
return
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
let tag = tags.first!
|
|
161
|
+
var passportTag: NFCISO7816Tag
|
|
162
|
+
switch tags.first! {
|
|
163
|
+
case let .iso7816(tag):
|
|
164
|
+
passportTag = tag
|
|
165
|
+
default:
|
|
166
|
+
Logger.passportReader.debug( "tagReaderSession:invalid tag detected!!!" )
|
|
167
|
+
|
|
168
|
+
let errorMessage = NFCViewDisplayMessage.error(NFCPassportReaderError.TagNotValid)
|
|
169
|
+
self.invalidateSession(errorMessage:errorMessage, error: NFCPassportReaderError.TagNotValid)
|
|
170
|
+
return
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
Task { [passportTag] in
|
|
174
|
+
do {
|
|
175
|
+
try await session.connect(to: tag)
|
|
176
|
+
|
|
177
|
+
Logger.passportReader.debug( "tagReaderSession:connected to tag - starting authentication" )
|
|
178
|
+
self.updateReaderSessionMessage( alertMessage: NFCViewDisplayMessage.authenticatingWithPassport(0) )
|
|
179
|
+
|
|
180
|
+
let tagReader = TagReader(tag:passportTag)
|
|
181
|
+
|
|
182
|
+
if let newAmount = self.dataAmountToReadOverride {
|
|
183
|
+
tagReader.overrideDataAmountToRead(newAmount: newAmount)
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
tagReader.progress = { [unowned self] (progress) in
|
|
187
|
+
if let dgId = self.currentlyReadingDataGroup {
|
|
188
|
+
self.updateReaderSessionMessage( alertMessage: NFCViewDisplayMessage.readingDataGroupProgress(dgId, progress) )
|
|
189
|
+
} else {
|
|
190
|
+
self.updateReaderSessionMessage( alertMessage: NFCViewDisplayMessage.authenticatingWithPassport(progress) )
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
let passportModel = try await self.startReading( tagReader : tagReader)
|
|
195
|
+
nfcContinuation?.resume(returning: passportModel)
|
|
196
|
+
nfcContinuation = nil
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
} catch let error as NFCPassportReaderError {
|
|
200
|
+
let errorMessage = NFCViewDisplayMessage.error(error)
|
|
201
|
+
self.invalidateSession(errorMessage: errorMessage, error: error)
|
|
202
|
+
} catch let error {
|
|
203
|
+
Logger.passportReader.debug( "tagReaderSession:failed to connect to tag - \(error.localizedDescription)" )
|
|
204
|
+
let errorMessage = NFCViewDisplayMessage.error(NFCPassportReaderError.ConnectionError)
|
|
205
|
+
self.invalidateSession(errorMessage: errorMessage, error: NFCPassportReaderError.Unknown(error))
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
func updateReaderSessionMessage(alertMessage: NFCViewDisplayMessage ) {
|
|
211
|
+
self.readerSession?.alertMessage = self.nfcViewDisplayMessageHandler?(alertMessage) ?? alertMessage.description
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
@available(iOS 15, *)
|
|
216
|
+
extension PassportReader {
|
|
217
|
+
|
|
218
|
+
func startReading(tagReader : TagReader) async throws -> NFCPassportModel {
|
|
219
|
+
|
|
220
|
+
if !skipPACE {
|
|
221
|
+
do {
|
|
222
|
+
// let data = try await tagReader.readCardAccess()
|
|
223
|
+
|
|
224
|
+
let data = hexRepToBin("3134300d060804007f0007020202020101300f060a04007f000702020302020201013012060a04007f0007020204020202010202010d")
|
|
225
|
+
|
|
226
|
+
// Logger.passportReader.debug( "Read CardAccess - data \(binToHexRep(data))" )
|
|
227
|
+
let cardAccess = try CardAccess(data)
|
|
228
|
+
passport.cardAccess = cardAccess
|
|
229
|
+
|
|
230
|
+
Logger.passportReader.info( "Starting Password Authenticated Connection Establishment (PACE)" )
|
|
231
|
+
|
|
232
|
+
let paceHandler = try PACEHandler( cardAccess: cardAccess, tagReader: tagReader )
|
|
233
|
+
try await paceHandler.doPACE(canKey: canKey )
|
|
234
|
+
passport.PACEStatus = .success
|
|
235
|
+
Logger.passportReader.debug( "PACE Succeeded" )
|
|
236
|
+
} catch let error {
|
|
237
|
+
passport.PACEStatus = .failed
|
|
238
|
+
Logger.passportReader.error("Có lỗi xảy ra: \(error)")
|
|
239
|
+
Logger.passportReader.error( "PACE Failed - falling back to BAC" )
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
_ = try await tagReader.selectPassportApplication()
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Now to read the datagroups
|
|
246
|
+
try await readDataGroups(tagReader: tagReader)
|
|
247
|
+
|
|
248
|
+
try await doActiveAuthenticationIfNeccessary(tagReader : tagReader)
|
|
249
|
+
|
|
250
|
+
self.updateReaderSessionMessage(alertMessage: NFCViewDisplayMessage.successfulRead)
|
|
251
|
+
self.shouldNotReportNextReaderSessionInvalidationErrorUserCanceled = true
|
|
252
|
+
self.readerSession?.invalidate()
|
|
253
|
+
|
|
254
|
+
// If we have a masterlist url set then use that and verify the passport now
|
|
255
|
+
self.passport.verifyPassport(masterListURL: self.masterListURL, useCMSVerification: self.passiveAuthenticationUsesOpenSSL)
|
|
256
|
+
|
|
257
|
+
return self.passport
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
func doActiveAuthenticationIfNeccessary( tagReader : TagReader) async throws {
|
|
262
|
+
guard self.passport.activeAuthenticationSupported else {
|
|
263
|
+
return
|
|
264
|
+
}
|
|
265
|
+
self.updateReaderSessionMessage(alertMessage: NFCViewDisplayMessage.activeAuthentication)
|
|
266
|
+
|
|
267
|
+
Logger.passportReader.info( "Performing Active Authentication" )
|
|
268
|
+
|
|
269
|
+
let challenge = generateRandomUInt8Array(8)
|
|
270
|
+
Logger.passportReader.debug( "Generated Active Authentication challange - \(binToHexRep(challenge))")
|
|
271
|
+
let response = try await tagReader.doInternalAuthentication(challenge: challenge, useExtendedMode: useExtendedMode)
|
|
272
|
+
self.passport.verifyActiveAuthentication( challenge:challenge, signature:response.data )
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
func readDataGroups( tagReader: TagReader ) async throws {
|
|
276
|
+
|
|
277
|
+
// Read COM
|
|
278
|
+
var DGsToRead = [DataGroupId]()
|
|
279
|
+
|
|
280
|
+
self.updateReaderSessionMessage( alertMessage: NFCViewDisplayMessage.readingDataGroupProgress(.COM, 0) )
|
|
281
|
+
if let com = try await readDataGroup(tagReader:tagReader, dgId:.COM) as? COM {
|
|
282
|
+
self.passport.addDataGroup( .COM, dataGroup:com )
|
|
283
|
+
|
|
284
|
+
// SOD and COM shouldn't be present in the DG list but just in case (worst case here we read the sod twice)
|
|
285
|
+
DGsToRead = [.SOD] + com.dataGroupsPresent.map { DataGroupId.getIDFromName(name:$0) }
|
|
286
|
+
DGsToRead.removeAll { $0 == .COM }
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
if DGsToRead.contains( .DG14 ) {
|
|
290
|
+
DGsToRead.removeAll { $0 == .DG14 }
|
|
291
|
+
|
|
292
|
+
if !skipCA {
|
|
293
|
+
// Do Chip Authentication
|
|
294
|
+
if let dg14 = try await readDataGroup(tagReader:tagReader, dgId:.DG14) as? DataGroup14 {
|
|
295
|
+
self.passport.addDataGroup( .DG14, dataGroup:dg14 )
|
|
296
|
+
let caHandler = ChipAuthenticationHandler(dg14: dg14, tagReader: tagReader)
|
|
297
|
+
|
|
298
|
+
if caHandler.isChipAuthenticationSupported {
|
|
299
|
+
do {
|
|
300
|
+
// Do Chip authentication and then continue reading datagroups
|
|
301
|
+
try await caHandler.doChipAuthentication()
|
|
302
|
+
self.passport.chipAuthenticationStatus = .success
|
|
303
|
+
} catch {
|
|
304
|
+
Logger.passportReader.info( "Chip Authentication failed - re-establishing BAC")
|
|
305
|
+
self.passport.chipAuthenticationStatus = .failed
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// If we are skipping secure elements then remove .DG3 and .DG4
|
|
313
|
+
if self.skipSecureElements {
|
|
314
|
+
DGsToRead = DGsToRead.filter { $0 != .DG3 && $0 != .DG4 }
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
if self.readAllDatagroups != true {
|
|
318
|
+
DGsToRead = DGsToRead.filter { dataGroupsToRead.contains($0) }
|
|
319
|
+
}
|
|
320
|
+
for dgId in DGsToRead {
|
|
321
|
+
self.updateReaderSessionMessage( alertMessage: NFCViewDisplayMessage.readingDataGroupProgress(dgId, 0) )
|
|
322
|
+
if let dg = try await readDataGroup(tagReader:tagReader, dgId:dgId) {
|
|
323
|
+
self.passport.addDataGroup( dgId, dataGroup:dg )
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
func readDataGroup( tagReader : TagReader, dgId : DataGroupId ) async throws -> DataGroup? {
|
|
329
|
+
|
|
330
|
+
self.currentlyReadingDataGroup = dgId
|
|
331
|
+
Logger.passportReader.info( "Reading tag - \(dgId.getName())" )
|
|
332
|
+
var readAttempts = 0
|
|
333
|
+
var nfcPassportReaderError: NFCPassportReaderError
|
|
334
|
+
|
|
335
|
+
self.updateReaderSessionMessage( alertMessage: NFCViewDisplayMessage.readingDataGroupProgress(dgId, 0) )
|
|
336
|
+
|
|
337
|
+
repeat {
|
|
338
|
+
do {
|
|
339
|
+
let response = try await tagReader.readDataGroup(dataGroup:dgId)
|
|
340
|
+
let dg = try DataGroupParser().parseDG(data: response)
|
|
341
|
+
return dg
|
|
342
|
+
} catch let error as NFCPassportReaderError {
|
|
343
|
+
Logger.passportReader.error( "TagError reading tag - \(error)" )
|
|
344
|
+
nfcPassportReaderError = error
|
|
345
|
+
|
|
346
|
+
// OK we had an error - depending on what happened, we may want to try to re-read this
|
|
347
|
+
// E.g. we failed to read the last Datagroup because its protected and we can't
|
|
348
|
+
let errMsg = error.value
|
|
349
|
+
Logger.passportReader.error( "ERROR - \(errMsg)" )
|
|
350
|
+
if errMsg == "Session invalidated" || errMsg == "Class not supported" || errMsg == "Tag connection lost" || errMsg == "Tag response error / no response" {
|
|
351
|
+
// Check if we have done Chip Authentication, if so, set it to nil and try to redo BAC
|
|
352
|
+
if self.caHandler != nil {
|
|
353
|
+
self.caHandler = nil
|
|
354
|
+
} else {
|
|
355
|
+
// Can't go any more!
|
|
356
|
+
throw error
|
|
357
|
+
}
|
|
358
|
+
} else if errMsg == "Security status not satisfied" || errMsg == "File not found" {
|
|
359
|
+
// Can't read this element as we aren't allowed - remove it and return out so we re-do BAC
|
|
360
|
+
self.dataGroupsToRead.removeFirst()
|
|
361
|
+
|
|
362
|
+
} else if errMsg == "SM data objects incorrect" || errMsg == "Class not supported" {
|
|
363
|
+
// Can't read this element security objects now invalid - and return out so we re-do BAC
|
|
364
|
+
} else if errMsg.hasPrefix( "Wrong length" ) || errMsg.hasPrefix( "End of file" ) { // Should now handle errors 0x6C xx, and 0x67 0x00
|
|
365
|
+
// OK passport can't handle max length so drop it down
|
|
366
|
+
tagReader.reduceDataReadingAmount()
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
}
|
|
370
|
+
readAttempts += 1
|
|
371
|
+
} while ( readAttempts < 2 )
|
|
372
|
+
|
|
373
|
+
// The error will be thrown after n attempts
|
|
374
|
+
throw nfcPassportReaderError
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
func invalidateSession(errorMessage: NFCViewDisplayMessage, error: NFCPassportReaderError) {
|
|
378
|
+
// Mark the next 'invalid session' error as not reportable (we're about to cause it by invalidating the
|
|
379
|
+
// session). The real error is reported back with the call to the completed handler
|
|
380
|
+
self.shouldNotReportNextReaderSessionInvalidationErrorUserCanceled = true
|
|
381
|
+
self.readerSession?.invalidate(errorMessage: self.nfcViewDisplayMessageHandler?(errorMessage) ?? errorMessage.description)
|
|
382
|
+
nfcContinuation?.resume(throwing: error)
|
|
383
|
+
nfcContinuation = nil
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
}
|
|
387
|
+
#endif
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
+
<plist version="1.0">
|
|
4
|
+
<dict>
|
|
5
|
+
<key>NSPrivacyCollectedDataTypes</key>
|
|
6
|
+
<array/>
|
|
7
|
+
<key>NSPrivacyAccessedAPITypes</key>
|
|
8
|
+
<array/>
|
|
9
|
+
<key>NSPrivacyTrackingDomains</key>
|
|
10
|
+
<array/>
|
|
11
|
+
<key>NSPrivacyTracking</key>
|
|
12
|
+
<false/>
|
|
13
|
+
</dict>
|
|
14
|
+
</plist>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
//
|
|
2
|
+
// ResponseAPDU.swift
|
|
3
|
+
// NFCPassportReader
|
|
4
|
+
//
|
|
5
|
+
// Created by Andy Qua on 09/02/2021.
|
|
6
|
+
// Copyright © 2021 Andy Qua. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
#if !os(macOS)
|
|
10
|
+
|
|
11
|
+
@available(iOS 13, *)
|
|
12
|
+
public struct ResponseAPDU {
|
|
13
|
+
|
|
14
|
+
public var data : [UInt8]
|
|
15
|
+
public var sw1 : UInt8
|
|
16
|
+
public var sw2 : UInt8
|
|
17
|
+
|
|
18
|
+
public init(data: [UInt8], sw1: UInt8, sw2: UInt8) {
|
|
19
|
+
self.data = data
|
|
20
|
+
self.sw1 = sw1
|
|
21
|
+
self.sw2 = sw2
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
#endif
|