@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,197 @@
|
|
|
1
|
+
//
|
|
2
|
+
// DetailsView.swift
|
|
3
|
+
// NFCPassportReaderApp
|
|
4
|
+
//
|
|
5
|
+
// Created by Andy Qua on 30/10/2019.
|
|
6
|
+
// Copyright © 2019 Andy Qua. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
import SwiftUI
|
|
10
|
+
import NFCPassportReader
|
|
11
|
+
|
|
12
|
+
struct Item : Identifiable {
|
|
13
|
+
var id = UUID()
|
|
14
|
+
var title : String
|
|
15
|
+
var value : String
|
|
16
|
+
|
|
17
|
+
var textColor : Color {
|
|
18
|
+
return value.hasPrefix("FAILED") ? Color.red : Color.primary
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
struct DetailsView : View {
|
|
24
|
+
private var passport: NFCPassportModel
|
|
25
|
+
private var sectionNames = ["Chip information", "Verification information", "Document signing certificate", "Country signing certificate", "Security Info details", "Datagroup Hashes"]
|
|
26
|
+
private var sections = [[Item]]()
|
|
27
|
+
|
|
28
|
+
init( passport : NFCPassportModel ) {
|
|
29
|
+
self.passport = passport
|
|
30
|
+
sections.append(getChipInfoSection(self.passport))
|
|
31
|
+
sections.append(getVerificationDetailsSection(self.passport))
|
|
32
|
+
sections.append(getCertificateSigningCertDetails(certItems:self.passport.documentSigningCertificate?.getItemsAsDict()))
|
|
33
|
+
sections.append(getCertificateSigningCertDetails(certItems:self.passport.countrySigningCertificate?.getItemsAsDict()))
|
|
34
|
+
sections.append(getSecurityInfosSection(self.passport))
|
|
35
|
+
sections.append(getDataGroupHashesSection(self.passport))
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
var body: some View {
|
|
39
|
+
VStack {
|
|
40
|
+
List {
|
|
41
|
+
ForEach( 0 ..< self.sectionNames.count ) { i in
|
|
42
|
+
if self.sections[i].count > 0 {
|
|
43
|
+
SectionGroup(sectionTitle: self.sectionNames[i], items: self.sections[i])
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
func getChipInfoSection(_ passport: NFCPassportModel) -> [Item] {
|
|
51
|
+
// Build Chip info section
|
|
52
|
+
let chipInfo = [Item(title:"LDS Version", value: passport.LDSVersion),
|
|
53
|
+
Item(title:"Data groups present", value: passport.dataGroupsPresent.joined(separator: ", ")),
|
|
54
|
+
Item(title:"Data groups read", value: passport.dataGroupsAvailable.map { $0.getName()}.joined(separator: ", "))]
|
|
55
|
+
|
|
56
|
+
return chipInfo
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
func getVerificationDetailsSection(_ passport: NFCPassportModel) -> [Item] {
|
|
60
|
+
// Build Verification Info section
|
|
61
|
+
var activeAuth : String = "Not supported"
|
|
62
|
+
if passport.activeAuthenticationSupported {
|
|
63
|
+
activeAuth = passport.activeAuthenticationPassed ? "SUCCESS\nSignature verified" : "FAILED\nCould not verify signature"
|
|
64
|
+
}
|
|
65
|
+
var chipAuth : String = "Not supported"
|
|
66
|
+
if passport.isChipAuthenticationSupported {
|
|
67
|
+
switch( passport.chipAuthenticationStatus ) {
|
|
68
|
+
case .notDone:
|
|
69
|
+
chipAuth = "Supported - Not done"
|
|
70
|
+
case .success:
|
|
71
|
+
chipAuth = "SUCCESS\nSignature verified"
|
|
72
|
+
case .failed:
|
|
73
|
+
chipAuth = "FAILED\nCould not verify signature"
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
var authType : String = "Authentication not done"
|
|
78
|
+
if passport.PACEStatus == .success {
|
|
79
|
+
authType = "PACE"
|
|
80
|
+
} else if passport.BACStatus == .success {
|
|
81
|
+
authType = "BAC"
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Do PACE Info
|
|
85
|
+
var paceStatus = "Not Supported"
|
|
86
|
+
if passport.isPACESupported {
|
|
87
|
+
switch( passport.PACEStatus ) {
|
|
88
|
+
case .notDone:
|
|
89
|
+
paceStatus = "Supported - Not done"
|
|
90
|
+
case .success:
|
|
91
|
+
paceStatus = "SUCCESS"
|
|
92
|
+
case .failed:
|
|
93
|
+
paceStatus = "FAILED"
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
let verificationDetails : [Item] = [
|
|
98
|
+
Item(title: "Access Control", value: authType),
|
|
99
|
+
Item(title: "PACE", value: paceStatus),
|
|
100
|
+
Item(title: "Chip Authentication", value: chipAuth),
|
|
101
|
+
Item(title: "Active Authentication", value: activeAuth),
|
|
102
|
+
Item(title: "Document Signing Certificate", value: passport.documentSigningCertificateVerified ? "SUCCESS\nSOD Signature verified" : "FAILED\nCouldn't verify SOD signature"),
|
|
103
|
+
Item(title: "Country signing Certificate", value: passport.passportCorrectlySigned ? "SUCCESS\nmatched to country signing certificate" : "FAILED\nCouldn't build trust chain"),
|
|
104
|
+
Item(title: "Data group hashes", value: passport.passportDataNotTampered ? "SUCCESS\nAll hashes match" : "FAILED\nCouldn't match hashes" )
|
|
105
|
+
]
|
|
106
|
+
|
|
107
|
+
return verificationDetails
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
func getCertificateSigningCertDetails( certItems : [CertificateItem : String]? ) -> [Item] {
|
|
111
|
+
let titles : [String] = ["Serial number", "Signature algorithm", "Public key algorithm", "Certificate fingerprint", "Issuer", "Subject", "Valid from", "Valid to"]
|
|
112
|
+
|
|
113
|
+
var items = [Item]()
|
|
114
|
+
if certItems?.count ?? 0 == 0 {
|
|
115
|
+
items.append( Item(title:"Certificate details", value: "NOT FOUND" ) )
|
|
116
|
+
} else {
|
|
117
|
+
for title in titles {
|
|
118
|
+
let ci = CertificateItem(rawValue:title)!
|
|
119
|
+
items.append( Item(title:title, value: certItems?[ci] ?? "") )
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return items
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
func getDataGroupHashesSection(_ passport: NFCPassportModel) -> [Item] {
|
|
126
|
+
var dgHashes = [Item]()
|
|
127
|
+
for id in DataGroupId.allCases {
|
|
128
|
+
if let hash = passport.dataGroupHashes[id] {
|
|
129
|
+
dgHashes.append( Item(title:hash.id, value:hash.match ? "MATCHED" : "UNMATCHED"))
|
|
130
|
+
dgHashes.append( Item(title:"SOD Hash", value: hash.sodHash))
|
|
131
|
+
dgHashes.append( Item(title:"Computed Hash", value: hash.computedHash))
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return dgHashes
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
func getSecurityInfosSection( _ passport : NFCPassportModel) -> [Item] {
|
|
138
|
+
guard let dg14 = passport.getDataGroup(.DG14) as? DataGroup14 else { return [] }
|
|
139
|
+
|
|
140
|
+
var items = [Item]()
|
|
141
|
+
for secInfo in dg14.securityInfos {
|
|
142
|
+
var title : String = ""
|
|
143
|
+
var value : String = ""
|
|
144
|
+
if let cai = secInfo as? ChipAuthenticationInfo {
|
|
145
|
+
title = "ChipAuthenticationInfo"
|
|
146
|
+
value = "\(secInfo.getProtocolOIDString())\n\(secInfo.getObjectIdentifier())\nUses Key Id: \(cai.getKeyId())"
|
|
147
|
+
} else if let capki = secInfo as? ChipAuthenticationPublicKeyInfo {
|
|
148
|
+
title = "ChipAuthenticationPublicKeyInfo"
|
|
149
|
+
value = "\(secInfo.getProtocolOIDString())\n\(secInfo.getObjectIdentifier())\nKey Id: \(capki.getKeyId())"
|
|
150
|
+
} else if let pacei = secInfo as? PACEInfo {
|
|
151
|
+
title = "PACEInfo"
|
|
152
|
+
value = "\(pacei.getProtocolOIDString())\n\(pacei.getObjectIdentifier())\nParameter ID: \(pacei.getParameterId() ?? -1)"
|
|
153
|
+
} else if let activeAuthInfo = secInfo as? ActiveAuthenticationInfo {
|
|
154
|
+
title = "ActiveAuthenticationInfo"
|
|
155
|
+
value =
|
|
156
|
+
"\(activeAuthInfo.getProtocolOIDString())\n\(activeAuthInfo.getSignatureAlgorithmOIDString() ?? "")"
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
items.append( Item(title:title, value: value))
|
|
160
|
+
|
|
161
|
+
}
|
|
162
|
+
return items
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
struct SectionGroup : View {
|
|
167
|
+
var sectionTitle : String
|
|
168
|
+
var items : [Item]
|
|
169
|
+
|
|
170
|
+
var body: some View {
|
|
171
|
+
Section(header: Text(sectionTitle)) {
|
|
172
|
+
ForEach(self.items) { item in
|
|
173
|
+
VStack(alignment:.leading, spacing:0) {
|
|
174
|
+
Text(item.title)
|
|
175
|
+
.font(.headline)
|
|
176
|
+
Text(item.value)
|
|
177
|
+
.foregroundColor(item.textColor)
|
|
178
|
+
.lineLimit(nil)
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
struct DetailsView_Previews: PreviewProvider {
|
|
187
|
+
|
|
188
|
+
static var previews: some View {
|
|
189
|
+
let settings = SettingsStore()
|
|
190
|
+
let passport = NFCPassportModel()
|
|
191
|
+
return DetailsView(passport:passport)
|
|
192
|
+
.environmentObject(settings)
|
|
193
|
+
.environment( \.colorScheme, .light)
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
//
|
|
2
|
+
// ExportPassportView.swift
|
|
3
|
+
// NFCPassportReaderApp
|
|
4
|
+
//
|
|
5
|
+
// Created by Andy Qua on 11/02/2021.
|
|
6
|
+
// Copyright © 2021 Andy Qua. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
import SwiftUI
|
|
10
|
+
import NFCPassportReader
|
|
11
|
+
|
|
12
|
+
struct MultipleSelectionRow: View {
|
|
13
|
+
var title: String
|
|
14
|
+
var isSelected: Bool
|
|
15
|
+
var action: () -> Void
|
|
16
|
+
|
|
17
|
+
var body: some View {
|
|
18
|
+
Button(action: self.action) {
|
|
19
|
+
HStack {
|
|
20
|
+
Text(self.title)
|
|
21
|
+
if self.isSelected {
|
|
22
|
+
Spacer()
|
|
23
|
+
Image(systemName: "checkmark")
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
.foregroundColor(.primary)
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
struct ExportPassportView: View {
|
|
32
|
+
@EnvironmentObject var settings: SettingsStore
|
|
33
|
+
|
|
34
|
+
@State var items: [DataGroupId] = []
|
|
35
|
+
@State var selections: [DataGroupId] = []
|
|
36
|
+
@State var isAASupported : Bool = false
|
|
37
|
+
@State var includeAA : Bool = false
|
|
38
|
+
|
|
39
|
+
var body: some View {
|
|
40
|
+
Form {
|
|
41
|
+
Section(header: Text("Select Passport items to export"), footer:Text("* contains personal information")) {
|
|
42
|
+
List {
|
|
43
|
+
ForEach(items, id: \.self) { item in
|
|
44
|
+
MultipleSelectionRow(title: dgToText(item), isSelected: self.selections.contains(item)) {
|
|
45
|
+
if self.selections.contains(item) {
|
|
46
|
+
self.selections.removeAll(where: { $0 == item })
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
self.selections.append(item)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if isAASupported {
|
|
55
|
+
Toggle("Include Active Authentication Challenge/Response?", isOn: $includeAA)
|
|
56
|
+
.foregroundColor(.primary)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
Button(action: {
|
|
60
|
+
sharePassport()
|
|
61
|
+
}, label: {
|
|
62
|
+
Text("Export selected passport details")
|
|
63
|
+
.font(.title3)
|
|
64
|
+
})
|
|
65
|
+
.foregroundColor(.primary)
|
|
66
|
+
}
|
|
67
|
+
.navigationTitle("Export passport")
|
|
68
|
+
.onAppear() {
|
|
69
|
+
if let passport = settings.passport {
|
|
70
|
+
items = [.SOD, .COM]
|
|
71
|
+
items.append(contentsOf: DataGroupId.allCases.filter { passport.dataGroupsAvailable.contains($0) } )
|
|
72
|
+
|
|
73
|
+
// Default select only the DGs that contain no personal info.
|
|
74
|
+
selections = [.SOD, .COM, .DG14, .DG15]
|
|
75
|
+
isAASupported = passport.activeAuthenticationSupported
|
|
76
|
+
if isAASupported {
|
|
77
|
+
includeAA = true
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
extension ExportPassportView {
|
|
85
|
+
func sharePassport() {
|
|
86
|
+
do {
|
|
87
|
+
let dict = settings.passport!.dumpPassportData( selectedDataGroups:selections,includeActiveAuthenticationData: includeAA)
|
|
88
|
+
let data = try JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted)
|
|
89
|
+
|
|
90
|
+
let temporaryURL = URL(fileURLWithPath: NSTemporaryDirectory() + "passport.json")
|
|
91
|
+
try data.write(to: temporaryURL)
|
|
92
|
+
|
|
93
|
+
let av = UIActivityViewController(activityItems: [temporaryURL], applicationActivities: nil)
|
|
94
|
+
|
|
95
|
+
let keyWindow = UIApplication.shared.connectedScenes
|
|
96
|
+
.filter({$0.activationState == .foregroundActive})
|
|
97
|
+
.map({$0 as? UIWindowScene})
|
|
98
|
+
.compactMap({$0})
|
|
99
|
+
.first?.windows
|
|
100
|
+
.filter({$0.isKeyWindow}).first
|
|
101
|
+
|
|
102
|
+
keyWindow?.rootViewController?.present(av, animated: true, completion: nil)
|
|
103
|
+
} catch {
|
|
104
|
+
print( "ERROR - \(error)" )
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
func dgToText( _ dg : DataGroupId ) -> String {
|
|
109
|
+
switch ( dg ) {
|
|
110
|
+
case .SOD:
|
|
111
|
+
return "SOD - Document Security Object"
|
|
112
|
+
case .COM:
|
|
113
|
+
return "COM - Header and DG Presence"
|
|
114
|
+
case .DG1:
|
|
115
|
+
return "DG1* - MRZ Info"
|
|
116
|
+
case .DG2:
|
|
117
|
+
return "DG2* - Face image"
|
|
118
|
+
case .DG3:
|
|
119
|
+
return "DG3* - Fingerprints"
|
|
120
|
+
case .DG4:
|
|
121
|
+
return "DG4* - Iris"
|
|
122
|
+
case .DG5:
|
|
123
|
+
return "DG5* - Displayed portrait"
|
|
124
|
+
case .DG6:
|
|
125
|
+
return "DG6 - Reserved"
|
|
126
|
+
case .DG7:
|
|
127
|
+
return "DG7* - Signature"
|
|
128
|
+
case .DG8:
|
|
129
|
+
return "DG8* - Data features"
|
|
130
|
+
case .DG9:
|
|
131
|
+
return "DG9* - Structure features"
|
|
132
|
+
case .DG10:
|
|
133
|
+
return "DG10* - Substance features"
|
|
134
|
+
case .DG11:
|
|
135
|
+
return "DG11* - Additional personal info"
|
|
136
|
+
case .DG12:
|
|
137
|
+
return "DG12* - Additional document info"
|
|
138
|
+
case .DG13:
|
|
139
|
+
return "DG13* - Optional details"
|
|
140
|
+
case .DG14:
|
|
141
|
+
return "DG14 - Security options"
|
|
142
|
+
case .DG15:
|
|
143
|
+
return "DG15 - Active Auth PubKey"
|
|
144
|
+
case .DG16:
|
|
145
|
+
return "DG16 - Person(s) to notify"
|
|
146
|
+
default:
|
|
147
|
+
return "Unknown"
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
struct ExportPassportView_Previews: PreviewProvider {
|
|
155
|
+
static var previews: some View {
|
|
156
|
+
let settings = SettingsStore()
|
|
157
|
+
settings.passport = NFCPassportModel()
|
|
158
|
+
|
|
159
|
+
return NavigationView {
|
|
160
|
+
ExportPassportView()
|
|
161
|
+
}
|
|
162
|
+
.environmentObject(settings)
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
//
|
|
2
|
+
// CheckBoxView.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
|
+
|
|
11
|
+
struct CheckBoxButtonStyle: ButtonStyle {
|
|
12
|
+
|
|
13
|
+
func makeBody(configuration: Self.Configuration) -> some View {
|
|
14
|
+
configuration.label
|
|
15
|
+
.foregroundColor(.secondary)
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
struct CheckBoxView: View {
|
|
21
|
+
@Binding var checked: Bool
|
|
22
|
+
var text : String
|
|
23
|
+
|
|
24
|
+
var body: some View {
|
|
25
|
+
HStack() {
|
|
26
|
+
|
|
27
|
+
Button(action: {
|
|
28
|
+
withAnimation {
|
|
29
|
+
self.checked.toggle()
|
|
30
|
+
}
|
|
31
|
+
}) {
|
|
32
|
+
HStack(alignment: .center, spacing: 10) {
|
|
33
|
+
Text(text)
|
|
34
|
+
Image(systemName:self.checked ? "checkmark.square.fill" : "square")
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
.frame(height: 44, alignment: .center)
|
|
38
|
+
.padding(.trailing)
|
|
39
|
+
.buttonStyle(CheckBoxButtonStyle())
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
struct CheckBoxView_Previews: PreviewProvider {
|
|
45
|
+
static var previews: some View {
|
|
46
|
+
CheckBoxView( checked: .constant(true), text:"Are you on?")
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//
|
|
2
|
+
// ViewExt.swift
|
|
3
|
+
// NFCPassportReaderApp
|
|
4
|
+
//
|
|
5
|
+
// Created by Andy Qua on 11/02/2021.
|
|
6
|
+
// Copyright © 2021 Andy Qua. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
import SwiftUI
|
|
10
|
+
import UIKit
|
|
11
|
+
|
|
12
|
+
extension View {
|
|
13
|
+
func hideKeyboard() {
|
|
14
|
+
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
func visibility(hidden: Binding<Bool>) -> some View {
|
|
18
|
+
modifier(VisibilityStyle(hidden: hidden))
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
//
|
|
2
|
+
// ViewModifiers.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
|
+
|
|
11
|
+
struct ClearButton: ViewModifier {
|
|
12
|
+
@Binding var text: String
|
|
13
|
+
|
|
14
|
+
public func body(content: Content) -> some View {
|
|
15
|
+
HStack {
|
|
16
|
+
content
|
|
17
|
+
if !text.isEmpty {
|
|
18
|
+
Button(action: { self.text = "" },
|
|
19
|
+
label: {
|
|
20
|
+
Image(systemName: "delete.left")
|
|
21
|
+
.foregroundColor(Color(UIColor.opaqueSeparator))
|
|
22
|
+
}
|
|
23
|
+
)
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
struct VisibilityStyle: ViewModifier {
|
|
30
|
+
|
|
31
|
+
@Binding var hidden: Bool
|
|
32
|
+
func body(content: Content) -> some View {
|
|
33
|
+
Group {
|
|
34
|
+
if hidden {
|
|
35
|
+
content.hidden()
|
|
36
|
+
} else {
|
|
37
|
+
content
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
//
|
|
2
|
+
// MRZEntryView.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
|
+
|
|
11
|
+
// This will be removed once DatePicker inline works correctly
|
|
12
|
+
struct DateView : View {
|
|
13
|
+
@Binding var date : Date
|
|
14
|
+
var title : String
|
|
15
|
+
|
|
16
|
+
var body : some View {
|
|
17
|
+
VStack {
|
|
18
|
+
Text(title)
|
|
19
|
+
.font(.largeTitle)
|
|
20
|
+
Spacer()
|
|
21
|
+
DatePicker("Date of birth", selection:$date, displayedComponents: .date)
|
|
22
|
+
.environment(\.timeZone, TimeZone(secondsFromGMT: 0)!)
|
|
23
|
+
.datePickerStyle(WheelDatePickerStyle())
|
|
24
|
+
.labelsHidden()
|
|
25
|
+
Spacer()
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// This should be a nice simple inline DatePicker here
|
|
31
|
+
// BUT there are bugs when you select dates it changes the date format
|
|
32
|
+
// from DD MMM YYYY to DD/MM/YYYY!)
|
|
33
|
+
// Will update when/if this gets fixed!
|
|
34
|
+
struct MRZEntryView : View {
|
|
35
|
+
@EnvironmentObject var settings: SettingsStore
|
|
36
|
+
|
|
37
|
+
// These will be removed once DatePicker inline works correctly
|
|
38
|
+
@State private var editDOB = false
|
|
39
|
+
@State private var editDOE = false
|
|
40
|
+
@State private var editDateTitle : String = ""
|
|
41
|
+
|
|
42
|
+
var body : some View {
|
|
43
|
+
let passportNrBinding = Binding<String>(get: {
|
|
44
|
+
settings.passportNumber
|
|
45
|
+
}, set: {
|
|
46
|
+
settings.passportNumber = $0.uppercased()
|
|
47
|
+
})
|
|
48
|
+
VStack {
|
|
49
|
+
NavigationLink( destination: DateView(date:$settings.dateOfBirth, title:editDateTitle), isActive: $editDOB) { Text("") }
|
|
50
|
+
NavigationLink( destination: DateView(date:$settings.dateOfExpiry, title:editDateTitle), isActive: $editDOE) { Text("") }
|
|
51
|
+
|
|
52
|
+
TextField("Passport number", text: passportNrBinding)
|
|
53
|
+
.textCase(.uppercase)
|
|
54
|
+
.modifier(ClearButton(text: passportNrBinding))
|
|
55
|
+
.textContentType(.name)
|
|
56
|
+
.foregroundColor(Color.primary)
|
|
57
|
+
.padding([.leading, .trailing])
|
|
58
|
+
.ignoresSafeArea(.keyboard, edges: .all)
|
|
59
|
+
|
|
60
|
+
Divider()
|
|
61
|
+
|
|
62
|
+
// Replace with DatePicker once it works correctly
|
|
63
|
+
HStack {
|
|
64
|
+
VStack {
|
|
65
|
+
Text( "Date of birth" )
|
|
66
|
+
Button(formatDate(settings.dateOfBirth)) {
|
|
67
|
+
editDateTitle = "Select date of birth"
|
|
68
|
+
editDOB = true
|
|
69
|
+
}
|
|
70
|
+
.padding(.horizontal, 15)
|
|
71
|
+
.padding(.vertical, 8)
|
|
72
|
+
.background(Color.black.opacity(0.07))
|
|
73
|
+
.cornerRadius(8)
|
|
74
|
+
}
|
|
75
|
+
Spacer()
|
|
76
|
+
VStack {
|
|
77
|
+
Text( "Passport expiry date" )
|
|
78
|
+
Button(formatDate(settings.dateOfExpiry)) {
|
|
79
|
+
editDateTitle = "Select passport expiry date"
|
|
80
|
+
editDOE = true
|
|
81
|
+
}
|
|
82
|
+
.padding(.horizontal, 15)
|
|
83
|
+
.padding(.vertical, 8)
|
|
84
|
+
.background(Color.black.opacity(0.07))
|
|
85
|
+
.cornerRadius(8)
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
.padding([.leading, .trailing])
|
|
89
|
+
|
|
90
|
+
Divider()
|
|
91
|
+
}
|
|
92
|
+
.ignoresSafeArea(.keyboard, edges: .bottom)
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// This will be removed once DatePicker inline works correctly
|
|
97
|
+
extension MRZEntryView {
|
|
98
|
+
|
|
99
|
+
func formatDate( _ date : Date ) -> String {
|
|
100
|
+
let df = DateFormatter()
|
|
101
|
+
df.timeZone = TimeZone.init(secondsFromGMT: 0)
|
|
102
|
+
df.dateFormat = "dd MMM yyyy"
|
|
103
|
+
let dateStr = df.string(from:date)
|
|
104
|
+
return dateStr
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
#if DEBUG
|
|
109
|
+
struct MRZEntryView_Previews : PreviewProvider {
|
|
110
|
+
|
|
111
|
+
static var previews: some View {
|
|
112
|
+
let settings = SettingsStore()
|
|
113
|
+
|
|
114
|
+
return
|
|
115
|
+
Group {
|
|
116
|
+
NavigationView {
|
|
117
|
+
MRZEntryView()
|
|
118
|
+
}
|
|
119
|
+
.environmentObject(settings)
|
|
120
|
+
.environment( \.colorScheme, .light)
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
#endif
|
|
125
|
+
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
//
|
|
2
|
+
// MRZScannerViewController.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 UIKit
|
|
10
|
+
import SwiftUI
|
|
11
|
+
import QKMRZScanner
|
|
12
|
+
|
|
13
|
+
// Wraps the QKMRZScanner component in a simple UIView that allows a scan of the MRZ area from a Passport/ID Card
|
|
14
|
+
struct MRZScanner: UIViewControllerRepresentable {
|
|
15
|
+
let completionHandler: (String,Date,Date) -> Void
|
|
16
|
+
|
|
17
|
+
func makeUIViewController(context: Context) -> MRZScannerViewController {
|
|
18
|
+
let vc = MRZScannerViewController()
|
|
19
|
+
vc.mrzScannerView.delegate = context.coordinator
|
|
20
|
+
return vc
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
func updateUIViewController(_ uiViewController: MRZScannerViewController, context: Context) {
|
|
24
|
+
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
func makeCoordinator() -> Coordinator {
|
|
28
|
+
return Coordinator(completionHandler: completionHandler)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
final class Coordinator: NSObject, QKMRZScannerViewDelegate {
|
|
32
|
+
let completionHandler: (String,Date,Date) -> Void
|
|
33
|
+
|
|
34
|
+
init(completionHandler: @escaping (String,Date,Date) -> Void) {
|
|
35
|
+
self.completionHandler = completionHandler
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
func mrzScannerView(_ mrzScannerView: QKMRZScannerView, didFind scanResult: QKMRZScanResult) {
|
|
39
|
+
print(scanResult)
|
|
40
|
+
if let dob = scanResult.birthdate, let doe = scanResult.expiryDate {
|
|
41
|
+
completionHandler(scanResult.documentNumber, dob, doe)
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// MARK: UIViewController implementation
|
|
48
|
+
class MRZScannerViewController: UIViewController {
|
|
49
|
+
let mrzScannerView = QKMRZScannerView()
|
|
50
|
+
|
|
51
|
+
override func viewDidLoad() {
|
|
52
|
+
super.viewDidLoad()
|
|
53
|
+
self.title = "Scan Passport"
|
|
54
|
+
self.navigationController?.title = "Scan passport"
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
let lbl = UILabel()
|
|
58
|
+
lbl.text = "Please scan the Machine Readable Zone."
|
|
59
|
+
lbl.numberOfLines = 0
|
|
60
|
+
self.view.addSubview(mrzScannerView)
|
|
61
|
+
self.view.addSubview(lbl)
|
|
62
|
+
|
|
63
|
+
mrzScannerView.translatesAutoresizingMaskIntoConstraints = false
|
|
64
|
+
mrzScannerView.topAnchor.constraint(equalTo: view.topAnchor, constant:50).isActive = true
|
|
65
|
+
mrzScannerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
|
|
66
|
+
mrzScannerView.widthAnchor.constraint(equalToConstant: view.bounds.width).isActive = true
|
|
67
|
+
mrzScannerView.heightAnchor.constraint(equalToConstant: view.bounds.width).isActive = true
|
|
68
|
+
|
|
69
|
+
lbl.translatesAutoresizingMaskIntoConstraints = false
|
|
70
|
+
lbl.leadingAnchor.constraint(equalTo: mrzScannerView.leadingAnchor, constant: 10).isActive = true
|
|
71
|
+
lbl.topAnchor.constraint(equalTo: mrzScannerView.bottomAnchor, constant: 10).isActive = true
|
|
72
|
+
lbl.trailingAnchor.constraint(equalTo: mrzScannerView.trailingAnchor, constant: 10).isActive = true
|
|
73
|
+
}
|
|
74
|
+
override func viewWillAppear(_ animated: Bool) {
|
|
75
|
+
super.viewWillAppear(animated)
|
|
76
|
+
mrzScannerView.startScanning()
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
override func viewWillDisappear(_ animated: Bool) {
|
|
80
|
+
super.viewWillDisappear(animated)
|
|
81
|
+
mrzScannerView.stopScanning()
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
extension MRZScannerViewController : QKMRZScannerViewDelegate {
|
|
86
|
+
func mrzScannerView(_ mrzScannerView: QKMRZScannerView, didFind scanResult: QKMRZScanResult) {
|
|
87
|
+
print(scanResult)
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|