@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
package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/MainView.swift
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
//
|
|
2
|
+
// MainView.swift
|
|
3
|
+
// NFCPassportReaderApp
|
|
4
|
+
//
|
|
5
|
+
// Created by Andy Qua on 04/06/2019.
|
|
6
|
+
// Copyright © 2019 Andy Qua. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
import SwiftUI
|
|
10
|
+
import OSLog
|
|
11
|
+
import Combine
|
|
12
|
+
import NFCPassportReader
|
|
13
|
+
import UniformTypeIdentifiers
|
|
14
|
+
import MRZParser
|
|
15
|
+
|
|
16
|
+
let appLogging = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "app")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
struct MainView : View {
|
|
20
|
+
@EnvironmentObject var settings: SettingsStore
|
|
21
|
+
@Environment(\.colorScheme) var colorScheme
|
|
22
|
+
|
|
23
|
+
@State private var showingAlert = false
|
|
24
|
+
@State private var showingSheet = false
|
|
25
|
+
@State private var showDetails = false
|
|
26
|
+
@State private var alertTitle : String = ""
|
|
27
|
+
@State private var alertMessage : String = ""
|
|
28
|
+
@State private var showSettings : Bool = false
|
|
29
|
+
@State private var showScanMRZ : Bool = false
|
|
30
|
+
@State private var showSavedPassports : Bool = false
|
|
31
|
+
@State private var gettingLogs : Bool = false
|
|
32
|
+
|
|
33
|
+
@State var page = 0
|
|
34
|
+
|
|
35
|
+
@State var bgColor = Color( UIColor.systemBackground )
|
|
36
|
+
|
|
37
|
+
private let passportReader = PassportReader()
|
|
38
|
+
|
|
39
|
+
var body: some View {
|
|
40
|
+
NavigationView {
|
|
41
|
+
ZStack {
|
|
42
|
+
NavigationLink( destination: SettingsView(), isActive: $showSettings) { Text("") }
|
|
43
|
+
NavigationLink( destination: PassportView(), isActive: $showDetails) { Text("") }
|
|
44
|
+
NavigationLink( destination: StoredPassportView(), isActive: $showSavedPassports) { Text("") }
|
|
45
|
+
NavigationLink( destination: MRZScanner(completionHandler: { mrz in
|
|
46
|
+
|
|
47
|
+
if let (docNr, dob, doe) = parse( mrz:mrz ) {
|
|
48
|
+
settings.passportNumber = docNr
|
|
49
|
+
settings.dateOfBirth = dob
|
|
50
|
+
settings.dateOfExpiry = doe
|
|
51
|
+
}
|
|
52
|
+
showScanMRZ = false
|
|
53
|
+
}).navigationTitle("Scan MRZ"), isActive: $showScanMRZ){ Text("") }
|
|
54
|
+
|
|
55
|
+
VStack {
|
|
56
|
+
HStack {
|
|
57
|
+
Spacer()
|
|
58
|
+
Button(action: {self.showScanMRZ.toggle()}) {
|
|
59
|
+
Label("Scan MRZ", systemImage:"camera")
|
|
60
|
+
}.padding([.top, .trailing])
|
|
61
|
+
}
|
|
62
|
+
MRZEntryView()
|
|
63
|
+
|
|
64
|
+
Button(action: {
|
|
65
|
+
self.scanPassport()
|
|
66
|
+
}) {
|
|
67
|
+
Text("Scan Passport")
|
|
68
|
+
.font(.largeTitle)
|
|
69
|
+
.foregroundColor(isValid ? .secondary : Color.secondary.opacity(0.25))
|
|
70
|
+
}
|
|
71
|
+
.disabled( !isValid )
|
|
72
|
+
|
|
73
|
+
Spacer()
|
|
74
|
+
HStack(alignment:.firstTextBaseline) {
|
|
75
|
+
Text( "Version - \(UIApplication.version)" )
|
|
76
|
+
.font(.footnote)
|
|
77
|
+
.padding(.leading)
|
|
78
|
+
Spacer()
|
|
79
|
+
Button(action: {
|
|
80
|
+
shareLogs()
|
|
81
|
+
}) {
|
|
82
|
+
Text("Share logs")
|
|
83
|
+
.foregroundColor(.secondary)
|
|
84
|
+
}.padding(.trailing)
|
|
85
|
+
.disabled( !isValid )
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if gettingLogs {
|
|
90
|
+
VStack {
|
|
91
|
+
VStack(alignment:.center) {
|
|
92
|
+
Text( "Retrieving logs....." )
|
|
93
|
+
.font(.title)
|
|
94
|
+
.frame(maxWidth:.infinity, maxHeight:150)
|
|
95
|
+
}
|
|
96
|
+
.shadow(radius: 10)
|
|
97
|
+
.background(.white)
|
|
98
|
+
.cornerRadius(20) /// make the background rounded
|
|
99
|
+
.overlay( /// apply a rounded border
|
|
100
|
+
RoundedRectangle(cornerRadius: 20)
|
|
101
|
+
.stroke(.gray, lineWidth: 2)
|
|
102
|
+
)
|
|
103
|
+
.padding()
|
|
104
|
+
Spacer()
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
.navigationBarTitle("Passport details", displayMode: .automatic)
|
|
109
|
+
.toolbar {
|
|
110
|
+
ToolbarItem(placement: .primaryAction) {
|
|
111
|
+
Menu {
|
|
112
|
+
Button(action: {showSettings.toggle()}) {
|
|
113
|
+
Label("Settings", systemImage: "gear")
|
|
114
|
+
}
|
|
115
|
+
Button(action: {self.showSavedPassports.toggle()}) {
|
|
116
|
+
Label("Show saved passports", systemImage: "doc")
|
|
117
|
+
}
|
|
118
|
+
} label: {
|
|
119
|
+
Image(systemName: "gear")
|
|
120
|
+
.foregroundColor(Color.secondary)
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
.alert(isPresented: $showingAlert) {
|
|
125
|
+
Alert(title: Text(alertTitle), message:
|
|
126
|
+
Text(alertMessage), dismissButton: .default(Text("Got it!")))
|
|
127
|
+
}
|
|
128
|
+
.background(colorScheme == .dark ? Color.black : Color.white)
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// MARK: View functions - functions that affect the view
|
|
134
|
+
extension MainView {
|
|
135
|
+
|
|
136
|
+
var isValid : Bool {
|
|
137
|
+
return settings.passportNumber.count >= 8
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
func parse( mrz:String ) -> (String, Date, Date)? {
|
|
141
|
+
print( "mrz = \(mrz)")
|
|
142
|
+
|
|
143
|
+
let parser = MRZParser(isOCRCorrectionEnabled: true)
|
|
144
|
+
if let result = parser.parse(mrzString: mrz),
|
|
145
|
+
let docNr = result.documentNumber,
|
|
146
|
+
let dob = result.birthdate,
|
|
147
|
+
let doe = result.expiryDate {
|
|
148
|
+
|
|
149
|
+
return (docNr, dob, doe)
|
|
150
|
+
}
|
|
151
|
+
return nil
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// MARK: Action Functions
|
|
156
|
+
extension MainView {
|
|
157
|
+
|
|
158
|
+
func shareLogs() {
|
|
159
|
+
gettingLogs = true
|
|
160
|
+
Task {
|
|
161
|
+
hideKeyboard()
|
|
162
|
+
PassportUtils.shareLogs()
|
|
163
|
+
gettingLogs = false
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
func scanPassport( ) {
|
|
168
|
+
lastPassportScanTime = Date.now
|
|
169
|
+
|
|
170
|
+
hideKeyboard()
|
|
171
|
+
self.showDetails = false
|
|
172
|
+
|
|
173
|
+
let df = DateFormatter()
|
|
174
|
+
df.timeZone = TimeZone(secondsFromGMT: 0)
|
|
175
|
+
df.dateFormat = "YYMMdd"
|
|
176
|
+
|
|
177
|
+
let pptNr = settings.passportNumber
|
|
178
|
+
let dob = df.string(from:settings.dateOfBirth)
|
|
179
|
+
let doe = df.string(from:settings.dateOfExpiry)
|
|
180
|
+
|
|
181
|
+
let passportUtils = PassportUtils()
|
|
182
|
+
let mrzKey = passportUtils.getMRZKey( passportNumber: pptNr, dateOfBirth: dob, dateOfExpiry: doe)
|
|
183
|
+
|
|
184
|
+
// Set the masterListURL on the Passport Reader to allow auto passport verification
|
|
185
|
+
let masterListURL = Bundle.main.url(forResource: "masterList", withExtension: ".pem")!
|
|
186
|
+
passportReader.setMasterListURL( masterListURL )
|
|
187
|
+
|
|
188
|
+
// Set whether to use the new Passive Authentication verification method (default true) or the old OpenSSL CMS verifiction
|
|
189
|
+
passportReader.passiveAuthenticationUsesOpenSSL = !settings.useNewVerificationMethod
|
|
190
|
+
|
|
191
|
+
// If we want to read only specific data groups we can using:
|
|
192
|
+
// let dataGroups : [DataGroupId] = [.COM, .SOD, .DG1, .DG2, .DG7, .DG11, .DG12, .DG14, .DG15]
|
|
193
|
+
// passportReader.readPassport(mrzKey: mrzKey, tags:dataGroups, completed: { (passport, error) in
|
|
194
|
+
|
|
195
|
+
appLogging.error( "Using version \(UIApplication.version)" )
|
|
196
|
+
|
|
197
|
+
Task {
|
|
198
|
+
let customMessageHandler : (NFCViewDisplayMessage)->String? = { (displayMessage) in
|
|
199
|
+
switch displayMessage {
|
|
200
|
+
case .requestPresentPassport:
|
|
201
|
+
return "Hold your iPhone near an NFC enabled passport."
|
|
202
|
+
default:
|
|
203
|
+
// Return nil for all other messages so we use the provided default
|
|
204
|
+
return nil
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
do {
|
|
209
|
+
|
|
210
|
+
let startIndex = mrzKey.index(mrzKey.startIndex, offsetBy: 3)
|
|
211
|
+
let canKey = String(mrzKey[startIndex...])
|
|
212
|
+
|
|
213
|
+
let passport = try await passportReader.readPassport( canKey: canKey, useExtendedMode: false, customDisplayMessage:customMessageHandler)
|
|
214
|
+
|
|
215
|
+
if let _ = passport.faceImageInfo {
|
|
216
|
+
print( "Got face Image details")
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
if settings.savePassportOnScan {
|
|
220
|
+
// Save passport
|
|
221
|
+
let dict = passport.dumpPassportData(selectedDataGroups: DataGroupId.allCases, includeActiveAuthenticationData: true)
|
|
222
|
+
if let data = try? JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted) {
|
|
223
|
+
|
|
224
|
+
let savedPath = FileManager.cachesFolder.appendingPathComponent("\(passport.documentNumber).json")
|
|
225
|
+
|
|
226
|
+
try? data.write(to: savedPath, options: .completeFileProtection)
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
DispatchQueue.main.async {
|
|
231
|
+
self.settings.passport = passport
|
|
232
|
+
self.showDetails = true
|
|
233
|
+
}
|
|
234
|
+
} catch {
|
|
235
|
+
self.alertTitle = "Oops"
|
|
236
|
+
self.alertTitle = error.localizedDescription
|
|
237
|
+
self.showingAlert = true
|
|
238
|
+
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
//MARK: PreviewProvider
|
|
245
|
+
#if DEBUG
|
|
246
|
+
struct ContentView_Previews : PreviewProvider {
|
|
247
|
+
|
|
248
|
+
static var previews: some View {
|
|
249
|
+
let settings = SettingsStore()
|
|
250
|
+
|
|
251
|
+
return Group {
|
|
252
|
+
MainView()
|
|
253
|
+
.environmentObject(settings)
|
|
254
|
+
.environment( \.colorScheme, .light)
|
|
255
|
+
MainView()
|
|
256
|
+
.environmentObject(settings)
|
|
257
|
+
.environment( \.colorScheme, .dark)
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
#endif
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
//
|
|
2
|
+
// PassportSummaryView.swift
|
|
3
|
+
// NFCPassportReaderApp
|
|
4
|
+
//
|
|
5
|
+
// Created by Andy Qua on 17/02/2021.
|
|
6
|
+
// Copyright © 2021 Andy Qua. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
import SwiftUI
|
|
10
|
+
import NFCPassportReader
|
|
11
|
+
|
|
12
|
+
struct PassportSummaryView: View {
|
|
13
|
+
@EnvironmentObject var settings: SettingsStore
|
|
14
|
+
|
|
15
|
+
@State var passport: NFCPassportModel
|
|
16
|
+
|
|
17
|
+
var body: some View {
|
|
18
|
+
VStack {
|
|
19
|
+
PassportDetailsView(passport: passport)
|
|
20
|
+
.background( Color.primary.colorInvert() )
|
|
21
|
+
.cornerRadius(10)
|
|
22
|
+
.shadow(radius: 20)
|
|
23
|
+
.overlay(
|
|
24
|
+
RoundedRectangle(cornerRadius: 10)
|
|
25
|
+
.stroke(Color.primary, lineWidth: 2)
|
|
26
|
+
)
|
|
27
|
+
.padding()
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
// Shows the Pzssport details
|
|
35
|
+
struct PassportDetailsView : View {
|
|
36
|
+
var passport: NFCPassportModel
|
|
37
|
+
|
|
38
|
+
var body: some View {
|
|
39
|
+
HStack(alignment: .top) {
|
|
40
|
+
VStack(alignment: .leading) {
|
|
41
|
+
Image(uiImage:passport.passportImage ?? UIImage(named:"head")!)
|
|
42
|
+
.resizable()
|
|
43
|
+
.renderingMode(.original)
|
|
44
|
+
.aspectRatio(contentMode: .fit)
|
|
45
|
+
.frame(width: 120, height: 180)
|
|
46
|
+
.padding([.leading], 10.0)
|
|
47
|
+
}
|
|
48
|
+
VStack {
|
|
49
|
+
HStack {
|
|
50
|
+
Text( passport.documentType)
|
|
51
|
+
Text( passport.issuingAuthority)
|
|
52
|
+
Text( passport.documentNumber)
|
|
53
|
+
Spacer()
|
|
54
|
+
}
|
|
55
|
+
HStack {
|
|
56
|
+
VStack(alignment: .leading) {
|
|
57
|
+
Text( passport.lastName)
|
|
58
|
+
Text( passport.firstName)
|
|
59
|
+
Text( passport.nationality)
|
|
60
|
+
Text( passport.dateOfBirth)
|
|
61
|
+
Text( passport.gender)
|
|
62
|
+
Text( passport.documentExpiryDate )
|
|
63
|
+
}
|
|
64
|
+
Spacer()
|
|
65
|
+
VStack {
|
|
66
|
+
if !passport.passportDataNotTampered {
|
|
67
|
+
Image( systemName:"exclamationmark").foregroundColor(.red)
|
|
68
|
+
.font(.system(size: 20))
|
|
69
|
+
Text( "Tampered")
|
|
70
|
+
.font(.caption)
|
|
71
|
+
.foregroundColor(.red)
|
|
72
|
+
.padding(.bottom)
|
|
73
|
+
}
|
|
74
|
+
if passport.passportCorrectlySigned && passport.documentSigningCertificateVerified {
|
|
75
|
+
Image( systemName:"checkmark.seal").foregroundColor(.green)
|
|
76
|
+
.font(.system(size: 25))
|
|
77
|
+
Text( "Genuine")
|
|
78
|
+
.font(.caption)
|
|
79
|
+
.foregroundColor(.green)
|
|
80
|
+
} else {
|
|
81
|
+
Image( systemName:"xmark.seal").foregroundColor(.red)
|
|
82
|
+
.font(.system(size: 25))
|
|
83
|
+
.padding([.leading,.trailing], 15)
|
|
84
|
+
Text( "Not Genuine")
|
|
85
|
+
.font(.caption)
|
|
86
|
+
.foregroundColor(.red)
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
.padding(.trailing)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
.padding(.top, 8)
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
struct PassportSummaryView_Previews: PreviewProvider {
|
|
99
|
+
static var previews: some View {
|
|
100
|
+
|
|
101
|
+
let settings = SettingsStore()
|
|
102
|
+
let passport = NFCPassportModel()
|
|
103
|
+
|
|
104
|
+
return Group {
|
|
105
|
+
PassportSummaryView(passport:passport)
|
|
106
|
+
.environment( \.colorScheme, .light)
|
|
107
|
+
.environmentObject(settings)
|
|
108
|
+
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
|
|
2
|
+
//
|
|
3
|
+
// PassportView.swift
|
|
4
|
+
// NFCPassportReaderApp
|
|
5
|
+
//
|
|
6
|
+
// Created by Andy Qua on 30/06/2019.
|
|
7
|
+
// Copyright © 2019 Andy Qua. All rights reserved.
|
|
8
|
+
//
|
|
9
|
+
|
|
10
|
+
import SwiftUI
|
|
11
|
+
import NFCPassportReader
|
|
12
|
+
|
|
13
|
+
struct PassportView : View {
|
|
14
|
+
@EnvironmentObject var settings: SettingsStore
|
|
15
|
+
@State private var showExportPassport : Bool = false
|
|
16
|
+
|
|
17
|
+
var body: some View {
|
|
18
|
+
VStack {
|
|
19
|
+
NavigationLink( destination: ExportPassportView(), isActive: $showExportPassport) { Text("") }
|
|
20
|
+
|
|
21
|
+
PassportSummaryView(passport:settings.passport!)
|
|
22
|
+
HStack {
|
|
23
|
+
|
|
24
|
+
Button(action: {showExportPassport.toggle()}) {
|
|
25
|
+
Label("Export passport", systemImage: "square.and.arrow.up")
|
|
26
|
+
}
|
|
27
|
+
.padding()
|
|
28
|
+
Spacer()
|
|
29
|
+
Button(action: {shareLogs()}) {
|
|
30
|
+
Label("Share logs", systemImage: "square.and.arrow.up")
|
|
31
|
+
}
|
|
32
|
+
.padding()
|
|
33
|
+
}
|
|
34
|
+
DetailsView(passport:settings.passport!)
|
|
35
|
+
}
|
|
36
|
+
.navigationTitle("Passport Details")
|
|
37
|
+
.navigationBarTitleDisplayMode(.inline)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
extension PassportView {
|
|
42
|
+
func shareLogs() {
|
|
43
|
+
hideKeyboard()
|
|
44
|
+
PassportUtils.shareLogs()
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
#if DEBUG
|
|
49
|
+
struct PassportView_Previews : PreviewProvider {
|
|
50
|
+
static var previews: some View {
|
|
51
|
+
|
|
52
|
+
let passport : NFCPassportModel
|
|
53
|
+
if let file = Bundle.main.url(forResource: "passport", withExtension: "json"),
|
|
54
|
+
let data = try? Data(contentsOf: file),
|
|
55
|
+
let json = try? JSONSerialization.jsonObject(with: data, options: []),
|
|
56
|
+
let arr = json as? [String:String] {
|
|
57
|
+
passport = NFCPassportModel(from: arr)
|
|
58
|
+
} else {
|
|
59
|
+
passport = NFCPassportModel()
|
|
60
|
+
}
|
|
61
|
+
let settings = SettingsStore()
|
|
62
|
+
settings.passport = passport
|
|
63
|
+
|
|
64
|
+
return NavigationView {
|
|
65
|
+
PassportView()
|
|
66
|
+
.environmentObject(settings)
|
|
67
|
+
.environment( \.colorScheme, .light)
|
|
68
|
+
.navigationTitle("WEEE")
|
|
69
|
+
.navigationBarTitleDisplayMode(.inline)
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
#endif
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
//
|
|
2
|
+
// SettingsView.swift
|
|
3
|
+
// NFCPassportReaderApp
|
|
4
|
+
//
|
|
5
|
+
// Created by Andy Qua on 10/02/2021.
|
|
6
|
+
// Copyright © 2021 Andy Qua. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
import SwiftUI
|
|
10
|
+
import NFCPassportReader
|
|
11
|
+
|
|
12
|
+
struct SettingsView: View {
|
|
13
|
+
@EnvironmentObject var settings: SettingsStore
|
|
14
|
+
|
|
15
|
+
private var logLevels = ["Verbose", "Debug", "Info", "Warning", "Error", "None"]
|
|
16
|
+
|
|
17
|
+
var body: some View {
|
|
18
|
+
Form {
|
|
19
|
+
Section(header: Text("Passport reading settings")) {
|
|
20
|
+
Toggle(isOn: $settings.useNewVerificationMethod) {
|
|
21
|
+
Text("Use new Passive Authentication")
|
|
22
|
+
}
|
|
23
|
+
.padding(.bottom)
|
|
24
|
+
VStack {
|
|
25
|
+
Toggle(isOn: $settings.savePassportOnScan) {
|
|
26
|
+
Text("Save passport on scan & import")
|
|
27
|
+
}
|
|
28
|
+
HStack {
|
|
29
|
+
Text( "Note - currently stored as JSON on device\nWill not be backed up to iCloud" )
|
|
30
|
+
.font(.footnote)
|
|
31
|
+
Spacer()
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
}
|
|
37
|
+
.navigationBarTitle(Text("Settings"))
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
struct SettingsView_Previews: PreviewProvider {
|
|
42
|
+
static var previews: some View {
|
|
43
|
+
let settings = SettingsStore()
|
|
44
|
+
SettingsView()
|
|
45
|
+
.environmentObject(settings)
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
//
|
|
2
|
+
// StorePassportView.swift
|
|
3
|
+
// NFCPassportReaderApp
|
|
4
|
+
//
|
|
5
|
+
// Created by Andy Qua on 17/02/2021.
|
|
6
|
+
// Copyright © 2021 Andy Qua. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
import SwiftUI
|
|
10
|
+
import NFCPassportReader
|
|
11
|
+
|
|
12
|
+
struct StoredPassportView: View {
|
|
13
|
+
@EnvironmentObject var settings: SettingsStore
|
|
14
|
+
@State private var showImport : Bool = false
|
|
15
|
+
@State private var showDetails = false
|
|
16
|
+
@State private var storedPassports = [URL]()
|
|
17
|
+
|
|
18
|
+
var body: some View {
|
|
19
|
+
ZStack {
|
|
20
|
+
NavigationLink( destination: PassportView(), isActive: $showDetails) { Text("") }
|
|
21
|
+
|
|
22
|
+
VStack {
|
|
23
|
+
List {
|
|
24
|
+
ForEach(self.storedPassports, id: \.self) { item in
|
|
25
|
+
Button(action:{
|
|
26
|
+
if let data = try? Data(contentsOf: item),
|
|
27
|
+
let passport = loadPassport(data:data) {
|
|
28
|
+
self.settings.passport = passport
|
|
29
|
+
self.showDetails = true
|
|
30
|
+
}
|
|
31
|
+
}) {
|
|
32
|
+
HStack {
|
|
33
|
+
Text(item.deletingPathExtension().lastPathComponent)
|
|
34
|
+
Spacer()
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
.foregroundColor(.primary)
|
|
38
|
+
}
|
|
39
|
+
.onDelete(perform: deletePassport)
|
|
40
|
+
}
|
|
41
|
+
Spacer()
|
|
42
|
+
if ( !settings.savePassportOnScan ) {
|
|
43
|
+
Text( "Imported or scanned passports are currently not being saved.\nThis can be changed in Settings" )
|
|
44
|
+
.multilineTextAlignment(.center)
|
|
45
|
+
.padding(10)
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
}
|
|
50
|
+
.toolbar {
|
|
51
|
+
ToolbarItem(placement: .primaryAction) {
|
|
52
|
+
Menu {
|
|
53
|
+
Button(action: {self.showImport.toggle()}) {
|
|
54
|
+
Label("Import passport", systemImage: "doc")
|
|
55
|
+
}
|
|
56
|
+
} label: {
|
|
57
|
+
Image(systemName: "square.and.arrow.down")
|
|
58
|
+
.foregroundColor(Color.secondary)
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
.fileImporter(
|
|
63
|
+
isPresented: $showImport, allowedContentTypes: [.json,.text],
|
|
64
|
+
allowsMultipleSelection: false
|
|
65
|
+
) { result in
|
|
66
|
+
|
|
67
|
+
hideKeyboard()
|
|
68
|
+
|
|
69
|
+
guard let selectedFile: URL = try? result.get().first else { return }
|
|
70
|
+
if selectedFile.startAccessingSecurityScopedResource() {
|
|
71
|
+
defer { selectedFile.stopAccessingSecurityScopedResource() }
|
|
72
|
+
importFile( url:selectedFile )
|
|
73
|
+
} else {
|
|
74
|
+
print("Unable to read file contents - denied")
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
}
|
|
78
|
+
.onAppear() {
|
|
79
|
+
loadStoredPassports()
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
extension StoredPassportView {
|
|
85
|
+
func loadStoredPassports() {
|
|
86
|
+
|
|
87
|
+
do {
|
|
88
|
+
let urls = try FileManager.default.contentsOfDirectory(at: FileManager.cachesFolder, includingPropertiesForKeys: nil, options: [])
|
|
89
|
+
|
|
90
|
+
storedPassports = urls.filter { $0.pathExtension == "json" }
|
|
91
|
+
} catch {
|
|
92
|
+
print("Could not search for urls of files in documents directory: \(error)")
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
func importFile( url : URL ) {
|
|
97
|
+
|
|
98
|
+
do {
|
|
99
|
+
let data = try Data(contentsOf: url )
|
|
100
|
+
if let passport = loadPassport( data: data ) {
|
|
101
|
+
|
|
102
|
+
if ( settings.savePassportOnScan ) {
|
|
103
|
+
// Save passport to docs folder
|
|
104
|
+
let savedPath = FileManager.cachesFolder.appendingPathComponent("\(passport.documentNumber).json")
|
|
105
|
+
try? data.write(to: savedPath, options: .completeFileProtection)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
self.settings.passport = passport
|
|
109
|
+
self.showDetails = true
|
|
110
|
+
}
|
|
111
|
+
} catch {
|
|
112
|
+
// Handle failure.
|
|
113
|
+
print("Unable to read file contents")
|
|
114
|
+
print(error.localizedDescription)
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
func loadPassport( data: Data) -> NFCPassportModel? {
|
|
119
|
+
let json = try? JSONSerialization.jsonObject(with: data, options: [])
|
|
120
|
+
if let arr = json as? [String:String] {
|
|
121
|
+
|
|
122
|
+
let passport = NFCPassportModel(from: arr)
|
|
123
|
+
|
|
124
|
+
let masterListURL = Bundle.main.url(forResource: "masterList", withExtension: ".pem")!
|
|
125
|
+
passport.verifyPassport(masterListURL: masterListURL)
|
|
126
|
+
return passport
|
|
127
|
+
}
|
|
128
|
+
return nil
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
func deletePassport( at offsets: IndexSet) {
|
|
132
|
+
|
|
133
|
+
let fm = FileManager.default
|
|
134
|
+
offsets.forEach {
|
|
135
|
+
let url = storedPassports[$0]
|
|
136
|
+
try? fm.removeItem(at: url)
|
|
137
|
+
}
|
|
138
|
+
storedPassports.remove(atOffsets: offsets)
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
struct StoredPassportView_Previews: PreviewProvider {
|
|
143
|
+
static var previews: some View {
|
|
144
|
+
let settings = SettingsStore()
|
|
145
|
+
|
|
146
|
+
StoredPassportView()
|
|
147
|
+
.environmentObject(settings)
|
|
148
|
+
}
|
|
149
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
|
2
|
+
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
|
|
31
|
+
ZhNynFjgmgY=
|
|
32
|
+
-----END CERTIFICATE-----
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# NFCPassportReaderApp
|
|
2
|
+
|
|
3
|
+
This is a sample app showing how to read a e-passport using the NFCPassportReader library
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
This is purely a demonstration - you have to manually enter the passport number, the date of birth and passport expiry date but it does calculate the checksums for you.
|
|
7
|
+
|
|
8
|
+
Also, the last entered passport details are saved to UserDefaults to save you having to re-enter them each time.
|
|
9
|
+
|
|
10
|
+
It reads my passport (and others I've been able to test) fine, however your milage may vary.
|