@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,79 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
+
<plist version="1.0">
|
|
4
|
+
<dict>
|
|
5
|
+
<key>CFBundleDevelopmentRegion</key>
|
|
6
|
+
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
|
7
|
+
<key>CFBundleDisplayName</key>
|
|
8
|
+
<string>NFCPassportReaderApp</string>
|
|
9
|
+
<key>CFBundleExecutable</key>
|
|
10
|
+
<string>$(EXECUTABLE_NAME)</string>
|
|
11
|
+
<key>CFBundleIdentifier</key>
|
|
12
|
+
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
|
13
|
+
<key>CFBundleInfoDictionaryVersion</key>
|
|
14
|
+
<string>6.0</string>
|
|
15
|
+
<key>CFBundleName</key>
|
|
16
|
+
<string>$(PRODUCT_NAME)</string>
|
|
17
|
+
<key>CFBundlePackageType</key>
|
|
18
|
+
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
|
19
|
+
<key>CFBundleShortVersionString</key>
|
|
20
|
+
<string>$(MARKETING_VERSION)</string>
|
|
21
|
+
<key>CFBundleVersion</key>
|
|
22
|
+
<string>$(CURRENT_PROJECT_VERSION)</string>
|
|
23
|
+
<key>LSRequiresIPhoneOS</key>
|
|
24
|
+
<true/>
|
|
25
|
+
<key>NFCReaderUsageDescription</key>
|
|
26
|
+
<string>This app uses NFC to scan passports</string>
|
|
27
|
+
<key>NSCameraUsageDescription</key>
|
|
28
|
+
<string>This app uses the camera to read passports</string>
|
|
29
|
+
<key>UIApplicationSceneManifest</key>
|
|
30
|
+
<dict>
|
|
31
|
+
<key>UIApplicationSupportsMultipleScenes</key>
|
|
32
|
+
<false/>
|
|
33
|
+
<key>UISceneConfigurations</key>
|
|
34
|
+
<dict>
|
|
35
|
+
<key>UIWindowSceneSessionRoleApplication</key>
|
|
36
|
+
<array>
|
|
37
|
+
<dict>
|
|
38
|
+
<key>UILaunchStoryboardName</key>
|
|
39
|
+
<string>LaunchScreen</string>
|
|
40
|
+
<key>UISceneConfigurationName</key>
|
|
41
|
+
<string>Default Configuration</string>
|
|
42
|
+
<key>UISceneDelegateClassName</key>
|
|
43
|
+
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
|
|
44
|
+
</dict>
|
|
45
|
+
</array>
|
|
46
|
+
</dict>
|
|
47
|
+
</dict>
|
|
48
|
+
<key>UIFileSharingEnabled</key>
|
|
49
|
+
<true/>
|
|
50
|
+
<key>UILaunchStoryboardName</key>
|
|
51
|
+
<string>LaunchScreen</string>
|
|
52
|
+
<key>UIRequiredDeviceCapabilities</key>
|
|
53
|
+
<array>
|
|
54
|
+
<string>nfc</string>
|
|
55
|
+
<string>armv7</string>
|
|
56
|
+
</array>
|
|
57
|
+
<key>UISupportedInterfaceOrientations</key>
|
|
58
|
+
<array>
|
|
59
|
+
<string>UIInterfaceOrientationPortrait</string>
|
|
60
|
+
<string>UIInterfaceOrientationLandscapeLeft</string>
|
|
61
|
+
<string>UIInterfaceOrientationLandscapeRight</string>
|
|
62
|
+
</array>
|
|
63
|
+
<key>UISupportedInterfaceOrientations~ipad</key>
|
|
64
|
+
<array>
|
|
65
|
+
<string>UIInterfaceOrientationPortrait</string>
|
|
66
|
+
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
|
67
|
+
<string>UIInterfaceOrientationLandscapeLeft</string>
|
|
68
|
+
<string>UIInterfaceOrientationLandscapeRight</string>
|
|
69
|
+
</array>
|
|
70
|
+
<key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
|
|
71
|
+
<array>
|
|
72
|
+
<string>D2760000850101</string>
|
|
73
|
+
<string>A0000002471001</string>
|
|
74
|
+
<string>A0000002472001</string>
|
|
75
|
+
<string>00000000000000</string>
|
|
76
|
+
<string>A000000151000000</string>
|
|
77
|
+
</array>
|
|
78
|
+
</dict>
|
|
79
|
+
</plist>
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
//
|
|
2
|
+
// PassportUtils.swift
|
|
3
|
+
// NFCPassportReaderApp
|
|
4
|
+
//
|
|
5
|
+
// Created by Andy Qua on 30/06/2019.
|
|
6
|
+
// Copyright © 2019 Andy Qua. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
import UIKit
|
|
10
|
+
import NFCPassportReader
|
|
11
|
+
import OSLog
|
|
12
|
+
|
|
13
|
+
var lastPassportScanTime : Date = Date().addingTimeInterval(-3600)
|
|
14
|
+
|
|
15
|
+
class PassportUtils {
|
|
16
|
+
|
|
17
|
+
func getMRZKey(passportNumber: String, dateOfBirth: String, dateOfExpiry: String ) -> String {
|
|
18
|
+
|
|
19
|
+
// Pad fields if necessary
|
|
20
|
+
let pptNr = pad( passportNumber, fieldLength:9)
|
|
21
|
+
let dob = pad( dateOfBirth, fieldLength:6)
|
|
22
|
+
let exp = pad( dateOfExpiry, fieldLength:6)
|
|
23
|
+
|
|
24
|
+
// Calculate checksums
|
|
25
|
+
let passportNrChksum = calcCheckSum(pptNr)
|
|
26
|
+
let dateOfBirthChksum = calcCheckSum(dob)
|
|
27
|
+
let expiryDateChksum = calcCheckSum(exp)
|
|
28
|
+
|
|
29
|
+
let mrzKey = "\(pptNr)\(passportNrChksum)\(dob)\(dateOfBirthChksum)\(exp)\(expiryDateChksum)"
|
|
30
|
+
|
|
31
|
+
return mrzKey
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
func pad( _ value : String, fieldLength:Int ) -> String {
|
|
35
|
+
// Pad out field lengths with < if they are too short
|
|
36
|
+
let paddedValue = (value + String(repeating: "<", count: fieldLength)).prefix(fieldLength)
|
|
37
|
+
return String(paddedValue)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
func calcCheckSum( _ checkString : String ) -> Int {
|
|
41
|
+
let characterDict = ["0" : "0", "1" : "1", "2" : "2", "3" : "3", "4" : "4", "5" : "5", "6" : "6", "7" : "7", "8" : "8", "9" : "9", "<" : "0", " " : "0", "A" : "10", "B" : "11", "C" : "12", "D" : "13", "E" : "14", "F" : "15", "G" : "16", "H" : "17", "I" : "18", "J" : "19", "K" : "20", "L" : "21", "M" : "22", "N" : "23", "O" : "24", "P" : "25", "Q" : "26", "R" : "27", "S" : "28","T" : "29", "U" : "30", "V" : "31", "W" : "32", "X" : "33", "Y" : "34", "Z" : "35"]
|
|
42
|
+
|
|
43
|
+
var sum = 0
|
|
44
|
+
var m = 0
|
|
45
|
+
let multipliers : [Int] = [7, 3, 1]
|
|
46
|
+
for c in checkString {
|
|
47
|
+
guard let lookup = characterDict["\(c)"],
|
|
48
|
+
let number = Int(lookup) else { return 0 }
|
|
49
|
+
let product = number * multipliers[m]
|
|
50
|
+
sum += product
|
|
51
|
+
m = (m+1) % 3
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return (sum % 10)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
static func shareLogs() {
|
|
58
|
+
do {
|
|
59
|
+
var arr = (try? getLogEntries()) ?? []
|
|
60
|
+
arr.insert("LogLevel,Date,Subsystem,Category,Message", at: 0)
|
|
61
|
+
|
|
62
|
+
let csv = arr.joined(separator:"\n")
|
|
63
|
+
if let data = csv.data(using: .utf8) {
|
|
64
|
+
|
|
65
|
+
let temporaryURL = URL(fileURLWithPath: NSTemporaryDirectory() + "passportreader_log.csv")
|
|
66
|
+
try data.write(to: temporaryURL)
|
|
67
|
+
|
|
68
|
+
let av = UIActivityViewController(activityItems: [temporaryURL], applicationActivities: nil)
|
|
69
|
+
let keyWindow = UIApplication.shared.connectedScenes
|
|
70
|
+
.filter({$0.activationState == .foregroundActive})
|
|
71
|
+
.map({$0 as? UIWindowScene})
|
|
72
|
+
.compactMap({$0})
|
|
73
|
+
.first?.windows
|
|
74
|
+
.filter({$0.isKeyWindow}).first
|
|
75
|
+
|
|
76
|
+
keyWindow?.rootViewController?.present(av, animated: true, completion: nil)
|
|
77
|
+
}
|
|
78
|
+
} catch {
|
|
79
|
+
print( "ERROR - \(error)" )
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
static func getLogEntries() throws -> [String] {
|
|
84
|
+
let subsystem = Bundle.main.bundleIdentifier!
|
|
85
|
+
|
|
86
|
+
print( "Getting logs since \(lastPassportScanTime)")
|
|
87
|
+
|
|
88
|
+
let logStore = try OSLogStore(scope: .currentProcessIdentifier)
|
|
89
|
+
let lastScanTime = logStore.position(date: lastPassportScanTime)
|
|
90
|
+
let allEntries = try logStore.getEntries(at: lastScanTime)
|
|
91
|
+
|
|
92
|
+
// FB8518539: Using NSPredicate to filter the subsystem doesn't seem to work.
|
|
93
|
+
return allEntries
|
|
94
|
+
.compactMap { $0 as? OSLogEntryLog }
|
|
95
|
+
.filter { $0.subsystem == subsystem && $0.date > lastPassportScanTime }
|
|
96
|
+
.map { "\($0.level.rawValue),\($0.date),\($0.subsystem),\($0.category),\"\($0.composedMessage)\"" }
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
//
|
|
2
|
+
// SettingsStore.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 Combine
|
|
11
|
+
import NFCPassportReader
|
|
12
|
+
|
|
13
|
+
final class SettingsStore: ObservableObject {
|
|
14
|
+
|
|
15
|
+
private enum Keys {
|
|
16
|
+
static let captureLog = "captureLog"
|
|
17
|
+
static let logLevel = "logLevel"
|
|
18
|
+
static let useNewVerification = "useNewVerification"
|
|
19
|
+
static let savePassportOnScan = "savePassportOnScan"
|
|
20
|
+
static let passportNumber = "passportNumber"
|
|
21
|
+
static let dateOfBirth = "dateOfBirth"
|
|
22
|
+
static let dateOfExpiry = "dateOfExpiry"
|
|
23
|
+
|
|
24
|
+
static let allVals = [captureLog, logLevel, useNewVerification, passportNumber, dateOfBirth, dateOfExpiry]
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
private let cancellable: Cancellable
|
|
28
|
+
private let defaults: UserDefaults
|
|
29
|
+
|
|
30
|
+
let objectWillChange = PassthroughSubject<Void, Never>()
|
|
31
|
+
|
|
32
|
+
init(defaults: UserDefaults = .standard) {
|
|
33
|
+
self.defaults = defaults
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
defaults.register(defaults: [
|
|
37
|
+
Keys.captureLog: true,
|
|
38
|
+
Keys.logLevel: 1,
|
|
39
|
+
Keys.useNewVerification: true,
|
|
40
|
+
Keys.savePassportOnScan: false,
|
|
41
|
+
Keys.passportNumber: "",
|
|
42
|
+
Keys.dateOfBirth: Date().timeIntervalSince1970,
|
|
43
|
+
Keys.dateOfExpiry: Date().timeIntervalSince1970,
|
|
44
|
+
])
|
|
45
|
+
|
|
46
|
+
cancellable = NotificationCenter.default
|
|
47
|
+
.publisher(for: UserDefaults.didChangeNotification)
|
|
48
|
+
.map { _ in () }
|
|
49
|
+
.subscribe(objectWillChange)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
func reset() {
|
|
53
|
+
if let bundleID = Bundle.main.bundleIdentifier {
|
|
54
|
+
UserDefaults.standard.removePersistentDomain(forName: bundleID)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
var shouldCaptureLogs: Bool {
|
|
59
|
+
set { defaults.set(newValue, forKey: Keys.captureLog) }
|
|
60
|
+
get { defaults.bool(forKey: Keys.captureLog) }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
var useNewVerificationMethod: Bool {
|
|
64
|
+
set { defaults.set(newValue, forKey: Keys.useNewVerification) }
|
|
65
|
+
get { defaults.bool(forKey: Keys.useNewVerification) }
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
var savePassportOnScan: Bool {
|
|
69
|
+
set { defaults.set(newValue, forKey: Keys.savePassportOnScan) }
|
|
70
|
+
get { defaults.bool(forKey: Keys.savePassportOnScan) }
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
var passportNumber: String {
|
|
74
|
+
set { defaults.set(newValue, forKey: Keys.passportNumber) }
|
|
75
|
+
get { defaults.string(forKey: Keys.passportNumber) ?? "" }
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
var dateOfBirth: Date {
|
|
79
|
+
set {
|
|
80
|
+
defaults.set(newValue.timeIntervalSince1970, forKey: Keys.dateOfBirth)
|
|
81
|
+
}
|
|
82
|
+
get {
|
|
83
|
+
let d = Date(timeIntervalSince1970: defaults.double(forKey: Keys.dateOfBirth))
|
|
84
|
+
return d
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
var dateOfExpiry: Date {
|
|
89
|
+
set {
|
|
90
|
+
defaults.set(newValue.timeIntervalSince1970, forKey: Keys.dateOfExpiry) }
|
|
91
|
+
get {
|
|
92
|
+
let d = Date(timeIntervalSince1970: defaults.double(forKey: Keys.dateOfExpiry))
|
|
93
|
+
return d
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
@Published var passport : NFCPassportModel?
|
|
98
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
//
|
|
2
|
+
// SettingsStoreCAN.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 Combine
|
|
11
|
+
import NFCPassportReader
|
|
12
|
+
|
|
13
|
+
final class SettingsStoreCAN: ObservableObject {
|
|
14
|
+
|
|
15
|
+
private enum Keys {
|
|
16
|
+
static let captureLog = "captureLog"
|
|
17
|
+
static let logLevel = "logLevel"
|
|
18
|
+
static let useNewVerification = "useNewVerification"
|
|
19
|
+
static let savePassportOnScan = "savePassportOnScan"
|
|
20
|
+
static let passportNumber = "passportNumber"
|
|
21
|
+
|
|
22
|
+
static let allVals = [captureLog, logLevel, useNewVerification, passportNumber,]
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
private let cancellable: Cancellable
|
|
26
|
+
private let defaults: UserDefaults
|
|
27
|
+
|
|
28
|
+
let objectWillChange = PassthroughSubject<Void, Never>()
|
|
29
|
+
|
|
30
|
+
init(defaults: UserDefaults = .standard) {
|
|
31
|
+
self.defaults = defaults
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
defaults.register(defaults: [
|
|
35
|
+
Keys.captureLog: true,
|
|
36
|
+
Keys.logLevel: 1,
|
|
37
|
+
Keys.useNewVerification: true,
|
|
38
|
+
Keys.savePassportOnScan: false,
|
|
39
|
+
Keys.passportNumber: "",
|
|
40
|
+
])
|
|
41
|
+
|
|
42
|
+
cancellable = NotificationCenter.default
|
|
43
|
+
.publisher(for: UserDefaults.didChangeNotification)
|
|
44
|
+
.map { _ in () }
|
|
45
|
+
.subscribe(objectWillChange)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
func reset() {
|
|
49
|
+
if let bundleID = Bundle.main.bundleIdentifier {
|
|
50
|
+
UserDefaults.standard.removePersistentDomain(forName: bundleID)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
var shouldCaptureLogs: Bool {
|
|
55
|
+
set { defaults.set(newValue, forKey: Keys.captureLog) }
|
|
56
|
+
get { defaults.bool(forKey: Keys.captureLog) }
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
var useNewVerificationMethod: Bool {
|
|
60
|
+
set { defaults.set(newValue, forKey: Keys.useNewVerification) }
|
|
61
|
+
get { defaults.bool(forKey: Keys.useNewVerification) }
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
var savePassportOnScan: Bool {
|
|
65
|
+
set { defaults.set(newValue, forKey: Keys.savePassportOnScan) }
|
|
66
|
+
get { defaults.bool(forKey: Keys.savePassportOnScan) }
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
var passportNumber: String {
|
|
70
|
+
set { defaults.set(newValue, forKey: Keys.passportNumber) }
|
|
71
|
+
get { defaults.string(forKey: Keys.passportNumber) ?? "" }
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
@Published var passport : NFCPassportModel?
|
|
75
|
+
}
|
package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/MrzScanner/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2020 Ali Mert Özdemir
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/*
|
|
2
|
+
See LICENSE folder for this sample’s licensing information.
|
|
3
|
+
|
|
4
|
+
Abstract:
|
|
5
|
+
Application preview view
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import UIKit
|
|
9
|
+
import AVFoundation
|
|
10
|
+
|
|
11
|
+
class PreviewView: UIView {
|
|
12
|
+
var videoPreviewLayer: AVCaptureVideoPreviewLayer {
|
|
13
|
+
guard let layer = layer as? AVCaptureVideoPreviewLayer else {
|
|
14
|
+
fatalError("Expected `AVCaptureVideoPreviewLayer` type for layer. Check PreviewView.layerClass implementation.")
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return layer
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
var session: AVCaptureSession? {
|
|
21
|
+
get {
|
|
22
|
+
return videoPreviewLayer.session
|
|
23
|
+
}
|
|
24
|
+
set {
|
|
25
|
+
videoPreviewLayer.session = newValue
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// MARK: UIView
|
|
30
|
+
|
|
31
|
+
override class var layerClass: AnyClass {
|
|
32
|
+
return AVCaptureVideoPreviewLayer.self
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/*
|
|
2
|
+
See LICENSE folder for this sample’s licensing information.
|
|
3
|
+
|
|
4
|
+
Abstract:
|
|
5
|
+
Utilities for dealing with recognized strings
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
|
|
10
|
+
var captureFirst = ""
|
|
11
|
+
var captureSecond = ""
|
|
12
|
+
var captureThird = ""
|
|
13
|
+
var mrz = ""
|
|
14
|
+
var temp_mrz = ""
|
|
15
|
+
|
|
16
|
+
extension String {
|
|
17
|
+
|
|
18
|
+
func checkMrz() -> (String)? {
|
|
19
|
+
|
|
20
|
+
let tdOneFirstRegex = "(I|C|A).[A-Z0<]{3}[A-Z0-9]{1,9}<?[0-9O]{1}[A-Z0-9<]{14,22}"
|
|
21
|
+
let tdOneSecondRegex = "[0-9O]{7}(M|F|<)[0-9O]{7}[A-Z0<]{3}[A-Z0-9<]{11}[0-9O]"
|
|
22
|
+
let tdOneThirdRegex = "([A-Z0]+<)+<([A-Z0]+<)+<+"
|
|
23
|
+
let tdOneMrzRegex = "(I|C|A).[A-Z0<]{3}[A-Z0-9]{1,9}<?[0-9O]{1}[A-Z0-9<]{14,22}\n[0-9O]{7}(M|F|<)[0-9O]{7}[A-Z0<]{3}[A-Z0-9<]{11}[0-9O]\n([A-Z0]+<)+<([A-Z0]+<)+<+"
|
|
24
|
+
|
|
25
|
+
let tdThreeFirstRegex = "P.[A-Z0<]{3}([A-Z0]+<)+<([A-Z0]+<)+<+"
|
|
26
|
+
let tdThreeSecondRegex = "[A-Z0-9]{1,9}<?[0-9O]{1}[A-Z0<]{3}[0-9]{7}(M|F|<)[0-9O]{7}[A-Z0-9<]+"
|
|
27
|
+
let tdThreeMrzRegex = "P.[A-Z0<]{3}([A-Z0]+<)+<([A-Z0]+<)+<+\n[A-Z0-9]{1,9}<?[0-9O]{1}[A-Z0<]{3}[0-9]{7}(M|F|<)[0-9O]{7}[A-Z0-9<]+"
|
|
28
|
+
|
|
29
|
+
let tdOneFirstLine = self.range(of: tdOneFirstRegex, options: .regularExpression, range: nil, locale: nil)
|
|
30
|
+
let tdOneSecondLine = self.range(of: tdOneSecondRegex, options: .regularExpression, range: nil, locale: nil)
|
|
31
|
+
let tdOneThirdLine = self.range(of: tdOneThirdRegex, options: .regularExpression, range: nil, locale: nil)
|
|
32
|
+
|
|
33
|
+
let tdThreeFirstLine = self.range(of: tdThreeFirstRegex, options: .regularExpression, range: nil, locale: nil)
|
|
34
|
+
let tdThreeSeconddLine = self.range(of: tdThreeSecondRegex, options: .regularExpression, range: nil, locale: nil)
|
|
35
|
+
|
|
36
|
+
if(tdOneFirstLine != nil){
|
|
37
|
+
if(self.count == 30){
|
|
38
|
+
captureFirst = self
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if(tdOneSecondLine != nil){
|
|
42
|
+
if(self.count == 30){
|
|
43
|
+
captureSecond = self
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if(tdOneThirdLine != nil){
|
|
47
|
+
if(self.count == 30){
|
|
48
|
+
captureThird = self
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if(tdThreeFirstLine != nil){
|
|
53
|
+
if(self.count == 44){
|
|
54
|
+
captureFirst = self
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if(tdThreeSeconddLine != nil){
|
|
59
|
+
if(self.count == 44){
|
|
60
|
+
captureSecond = self
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
if(captureFirst.count == 30 && captureSecond.count == 30 && captureThird.count == 30){
|
|
66
|
+
temp_mrz = (captureFirst.stripped + "\n" + captureSecond.stripped + "\n" + captureThird.stripped).replacingOccurrences(of: " ", with: "<")
|
|
67
|
+
|
|
68
|
+
let checkMrz = temp_mrz.range(of: tdOneMrzRegex, options: .regularExpression, range: nil, locale: nil)
|
|
69
|
+
if(checkMrz != nil){
|
|
70
|
+
mrz = temp_mrz
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if(captureFirst.count == 44 && captureSecond.count == 44){
|
|
75
|
+
temp_mrz = (captureFirst.stripped + "\n" + captureSecond.stripped).replacingOccurrences(of: " ", with: "<")
|
|
76
|
+
|
|
77
|
+
let checkMrz = temp_mrz.range(of: tdThreeMrzRegex, options: .regularExpression, range: nil, locale: nil)
|
|
78
|
+
if(checkMrz != nil){
|
|
79
|
+
mrz = temp_mrz
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if(mrz == ""){
|
|
84
|
+
return nil
|
|
85
|
+
}
|
|
86
|
+
return mrz
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
var stripped: String {
|
|
90
|
+
let okayChars = Set("ABCDEFGHIJKLKMNOPQRSTUVWXYZ1234567890<")
|
|
91
|
+
return self.filter {okayChars.contains($0) }
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
class StringTracker {
|
|
96
|
+
var frameIndex: Int64 = 0
|
|
97
|
+
|
|
98
|
+
typealias StringObservation = (lastSeen: Int64, count: Int64)
|
|
99
|
+
|
|
100
|
+
// Dictionary of seen strings. Used to get stable recognition before
|
|
101
|
+
// displaying anything.
|
|
102
|
+
var seenStrings = [String: StringObservation]()
|
|
103
|
+
var bestCount = Int64(0)
|
|
104
|
+
var bestString = ""
|
|
105
|
+
|
|
106
|
+
func logFrame(strings: [String]) {
|
|
107
|
+
for string in strings {
|
|
108
|
+
if seenStrings[string] == nil {
|
|
109
|
+
seenStrings[string] = (lastSeen: Int64(0), count: Int64(-1))
|
|
110
|
+
}
|
|
111
|
+
seenStrings[string]?.lastSeen = frameIndex
|
|
112
|
+
seenStrings[string]?.count += 1
|
|
113
|
+
//print("Seen \(string) \(seenStrings[string]?.count ?? 0) times")
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
var obsoleteStrings = [String]()
|
|
117
|
+
|
|
118
|
+
// Go through strings and prune any that have not been seen in while.
|
|
119
|
+
// Also find the (non-pruned) string with the greatest count.
|
|
120
|
+
for (string, obs) in seenStrings {
|
|
121
|
+
// Remove previously seen text after 30 frames (~1s).
|
|
122
|
+
if obs.lastSeen < frameIndex - 30 {
|
|
123
|
+
obsoleteStrings.append(string)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Find the string with the greatest count.
|
|
127
|
+
let count = obs.count
|
|
128
|
+
if !obsoleteStrings.contains(string) && count > bestCount {
|
|
129
|
+
bestCount = Int64(count)
|
|
130
|
+
bestString = string
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Remove old strings.
|
|
134
|
+
for string in obsoleteStrings {
|
|
135
|
+
seenStrings.removeValue(forKey: string)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
frameIndex += 1
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
func getStableString() -> String? {
|
|
142
|
+
// Require the recognizer to see the same string at least 10 times.
|
|
143
|
+
if bestCount >= 10 {
|
|
144
|
+
return bestString
|
|
145
|
+
} else {
|
|
146
|
+
return nil
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
func reset(string: String) {
|
|
151
|
+
seenStrings.removeValue(forKey: string)
|
|
152
|
+
bestCount = 0
|
|
153
|
+
bestString = ""
|
|
154
|
+
captureFirst = ""
|
|
155
|
+
captureSecond = ""
|
|
156
|
+
captureThird = ""
|
|
157
|
+
mrz = ""
|
|
158
|
+
temp_mrz = ""
|
|
159
|
+
}
|
|
160
|
+
}
|