@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,106 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<Scheme
|
|
3
|
+
LastUpgradeVersion = "1300"
|
|
4
|
+
version = "1.3">
|
|
5
|
+
<BuildAction
|
|
6
|
+
parallelizeBuildables = "YES"
|
|
7
|
+
buildImplicitDependencies = "YES">
|
|
8
|
+
<BuildActionEntries>
|
|
9
|
+
<BuildActionEntry
|
|
10
|
+
buildForTesting = "YES"
|
|
11
|
+
buildForRunning = "YES"
|
|
12
|
+
buildForProfiling = "YES"
|
|
13
|
+
buildForArchiving = "YES"
|
|
14
|
+
buildForAnalyzing = "YES">
|
|
15
|
+
<BuildableReference
|
|
16
|
+
BuildableIdentifier = "primary"
|
|
17
|
+
BlueprintIdentifier = "A16EB22C22A9E9E10008F53F"
|
|
18
|
+
BuildableName = "NFCPassportReaderApp.app"
|
|
19
|
+
BlueprintName = "NFCPassportReaderApp"
|
|
20
|
+
ReferencedContainer = "container:NFCPassportReaderApp.xcodeproj">
|
|
21
|
+
</BuildableReference>
|
|
22
|
+
</BuildActionEntry>
|
|
23
|
+
</BuildActionEntries>
|
|
24
|
+
</BuildAction>
|
|
25
|
+
<TestAction
|
|
26
|
+
buildConfiguration = "Debug"
|
|
27
|
+
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
28
|
+
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
29
|
+
shouldUseLaunchSchemeArgsEnv = "YES">
|
|
30
|
+
<Testables>
|
|
31
|
+
<TestableReference
|
|
32
|
+
skipped = "NO">
|
|
33
|
+
<BuildableReference
|
|
34
|
+
BuildableIdentifier = "primary"
|
|
35
|
+
BlueprintIdentifier = "NFCPassportReaderTests"
|
|
36
|
+
BuildableName = "NFCPassportReaderTests"
|
|
37
|
+
BlueprintName = "NFCPassportReaderTests"
|
|
38
|
+
ReferencedContainer = "container:..">
|
|
39
|
+
</BuildableReference>
|
|
40
|
+
</TestableReference>
|
|
41
|
+
<TestableReference
|
|
42
|
+
skipped = "NO">
|
|
43
|
+
<BuildableReference
|
|
44
|
+
BuildableIdentifier = "primary"
|
|
45
|
+
BlueprintIdentifier = "A1EBC50C2370B88D004DD19E"
|
|
46
|
+
BuildableName = "NFCPassportReaderAppTests.xctest"
|
|
47
|
+
BlueprintName = "NFCPassportReaderAppTests"
|
|
48
|
+
ReferencedContainer = "container:NFCPassportReaderApp.xcodeproj">
|
|
49
|
+
</BuildableReference>
|
|
50
|
+
</TestableReference>
|
|
51
|
+
</Testables>
|
|
52
|
+
</TestAction>
|
|
53
|
+
<LaunchAction
|
|
54
|
+
buildConfiguration = "Debug"
|
|
55
|
+
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
56
|
+
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
57
|
+
disableMainThreadChecker = "YES"
|
|
58
|
+
launchStyle = "0"
|
|
59
|
+
useCustomWorkingDirectory = "NO"
|
|
60
|
+
ignoresPersistentStateOnLaunch = "NO"
|
|
61
|
+
debugDocumentVersioning = "YES"
|
|
62
|
+
debugServiceExtension = "internal"
|
|
63
|
+
allowLocationSimulation = "YES">
|
|
64
|
+
<BuildableProductRunnable
|
|
65
|
+
runnableDebuggingMode = "0">
|
|
66
|
+
<BuildableReference
|
|
67
|
+
BuildableIdentifier = "primary"
|
|
68
|
+
BlueprintIdentifier = "A16EB22C22A9E9E10008F53F"
|
|
69
|
+
BuildableName = "NFCPassportReaderApp.app"
|
|
70
|
+
BlueprintName = "NFCPassportReaderApp"
|
|
71
|
+
ReferencedContainer = "container:NFCPassportReaderApp.xcodeproj">
|
|
72
|
+
</BuildableReference>
|
|
73
|
+
</BuildableProductRunnable>
|
|
74
|
+
<EnvironmentVariables>
|
|
75
|
+
<EnvironmentVariable
|
|
76
|
+
key = "OS_ACTIVITY_MODE"
|
|
77
|
+
value = "disable"
|
|
78
|
+
isEnabled = "YES">
|
|
79
|
+
</EnvironmentVariable>
|
|
80
|
+
</EnvironmentVariables>
|
|
81
|
+
</LaunchAction>
|
|
82
|
+
<ProfileAction
|
|
83
|
+
buildConfiguration = "Release"
|
|
84
|
+
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
85
|
+
savedToolIdentifier = ""
|
|
86
|
+
useCustomWorkingDirectory = "NO"
|
|
87
|
+
debugDocumentVersioning = "YES">
|
|
88
|
+
<BuildableProductRunnable
|
|
89
|
+
runnableDebuggingMode = "0">
|
|
90
|
+
<BuildableReference
|
|
91
|
+
BuildableIdentifier = "primary"
|
|
92
|
+
BlueprintIdentifier = "A16EB22C22A9E9E10008F53F"
|
|
93
|
+
BuildableName = "NFCPassportReaderApp.app"
|
|
94
|
+
BlueprintName = "NFCPassportReaderApp"
|
|
95
|
+
ReferencedContainer = "container:NFCPassportReaderApp.xcodeproj">
|
|
96
|
+
</BuildableReference>
|
|
97
|
+
</BuildableProductRunnable>
|
|
98
|
+
</ProfileAction>
|
|
99
|
+
<AnalyzeAction
|
|
100
|
+
buildConfiguration = "Debug">
|
|
101
|
+
</AnalyzeAction>
|
|
102
|
+
<ArchiveAction
|
|
103
|
+
buildConfiguration = "Release"
|
|
104
|
+
revealArchiveInOrganizer = "YES">
|
|
105
|
+
</ArchiveAction>
|
|
106
|
+
</Scheme>
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
//
|
|
2
|
+
// DataGroupParsingTests.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Andy Qua on 15/06/2019.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
import XCTest
|
|
10
|
+
import OpenSSL
|
|
11
|
+
|
|
12
|
+
@testable import NFCPassportReader
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
final class DataGroupParsingTests: XCTestCase {
|
|
16
|
+
func testDatagroup1Parsing() {
|
|
17
|
+
|
|
18
|
+
// Random generated test MRZ
|
|
19
|
+
let mrz = "P<GBRTHATCHER<<BOB<<<<<<<<<<<<<<<<<<<<<<<<<<7125143269GBR3906022M1601013<<<<<<<<<<<<<<08"
|
|
20
|
+
let mrzBin = [UInt8](mrz.data(using: .utf8)!)
|
|
21
|
+
let tag = try! [0x5F,0x1F] + toAsn1Length(mrzBin.count) + mrzBin
|
|
22
|
+
let dg1 = try! [0x61] + toAsn1Length(tag.count) + tag
|
|
23
|
+
|
|
24
|
+
let dgp = DataGroupParser()
|
|
25
|
+
XCTAssertNoThrow(try dgp.parseDG(data: dg1)) { dg in
|
|
26
|
+
XCTAssertNotNil(dg)
|
|
27
|
+
XCTAssertTrue( dg is DataGroup1 )
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
func testDatagroup2ParsingJPEG2000() {
|
|
32
|
+
|
|
33
|
+
// This is a cut down version of the DG2 record. It contains everything up to the end of the image header - no actuall image data as its way too big to include here
|
|
34
|
+
// I've also adjusted the record lengths accordingly
|
|
35
|
+
|
|
36
|
+
let dg2 = hexRepToBin("75617F61570201017F6082203FA1128002010081010282010087020101880200085F2E38464143003031300000002026000100002018000000000000000000010000000000000001000000000000000000000000000C6A5020200D0A")
|
|
37
|
+
|
|
38
|
+
let dgp = DataGroupParser()
|
|
39
|
+
XCTAssertNoThrow(try dgp.parseDG(data: dg2)) { dg in
|
|
40
|
+
XCTAssertNotNil(dg)
|
|
41
|
+
XCTAssertTrue( dg is DataGroup2 )
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
func testDatagroup2ParsingJPEG() {
|
|
47
|
+
|
|
48
|
+
// This is a cut down version of the DG2 record. It contains everything up to the begininnig of what would be the image data - no actual image data as its way too big to include here
|
|
49
|
+
// I've also adjusted the record lengths accordingly
|
|
50
|
+
|
|
51
|
+
let dg2 = hexRepToBin("75617F618220470201017F6082203FA1128002010081010282010087020101880200085F2E3846414300303130000000202600010000201800000000000000000001000000000000000100000000000000000000FFD8FFE000104A464946")
|
|
52
|
+
let dgp = DataGroupParser()
|
|
53
|
+
XCTAssertNoThrow(try dgp.parseDG(data: dg2)) { dg in
|
|
54
|
+
XCTAssertNotNil(dg)
|
|
55
|
+
XCTAssertTrue( dg is DataGroup2 )
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
func testDatagroup7ParsingJPEG() {
|
|
60
|
+
|
|
61
|
+
// This is a cut down version of the DG7 record. It contains everything up to the end of the image header - no actuall image data as its way too big to include here
|
|
62
|
+
// I've also adjusted the record lengths accordingly
|
|
63
|
+
|
|
64
|
+
let dg7 = hexRepToBin("678220060201015F4300")
|
|
65
|
+
let dgp = DataGroupParser()
|
|
66
|
+
XCTAssertNoThrow(try dgp.parseDG(data: dg7)) { dg in
|
|
67
|
+
XCTAssertNotNil(dg)
|
|
68
|
+
XCTAssertTrue( dg is DataGroup7 )
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
func testDatagroup11Parsing() {
|
|
73
|
+
|
|
74
|
+
// This is a cut down version of the DG7 record. It contains everything up to the end of the image header - no actuall image data as its way too big to include here
|
|
75
|
+
// I've also adjusted the record lengths accordingly
|
|
76
|
+
|
|
77
|
+
let dg11Val = hexRepToBin("6B305C065F0E5F2B5F115F0E0C546573743C3C5465737465725F2B0831393730313230315F110B4E6F727468616D70746F6E")
|
|
78
|
+
let dgp = DataGroupParser()
|
|
79
|
+
|
|
80
|
+
XCTAssertNoThrow(try dgp.parseDG(data: dg11Val)) { dg in
|
|
81
|
+
XCTAssertNotNil(dg)
|
|
82
|
+
XCTAssertTrue( dg is DataGroup11 )
|
|
83
|
+
|
|
84
|
+
let dg11 = dg as! DataGroup11
|
|
85
|
+
XCTAssertEqual(dg11.fullName, "Test<<Tester")
|
|
86
|
+
XCTAssertEqual(dg11.dateOfBirth, "19701201")
|
|
87
|
+
XCTAssertEqual(dg11.placeOfBirth, "Northampton")
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
func testDatagroup12Parsing() {
|
|
92
|
+
|
|
93
|
+
// This is a cut down version of the DG7 record. It contains everything up to the end of the image header - no actuall image data as its way too big to include here
|
|
94
|
+
// I've also adjusted the record lengths accordingly
|
|
95
|
+
|
|
96
|
+
let dg12Val = hexRepToBin("6C1A5C045F265F195F260832303138303332365F1906544553544552")
|
|
97
|
+
let dgp = DataGroupParser()
|
|
98
|
+
|
|
99
|
+
XCTAssertNoThrow(try dgp.parseDG(data: dg12Val)) { dg in
|
|
100
|
+
XCTAssertNotNil(dg)
|
|
101
|
+
XCTAssertTrue( dg is DataGroup12 )
|
|
102
|
+
|
|
103
|
+
let dg12 = dg as! DataGroup12
|
|
104
|
+
XCTAssertEqual(dg12.issuingAuthority, "TESTER")
|
|
105
|
+
XCTAssertEqual(dg12.dateOfIssue, "20180326")
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
func testDatagroup15Parsing() {
|
|
110
|
+
|
|
111
|
+
// This is a cut down version of the DG7 record. It contains everything up to the end of the image header - no actuall image data as its way too big to include here
|
|
112
|
+
// I've also adjusted the record lengths accordingly
|
|
113
|
+
|
|
114
|
+
let dg15Val = hexRepToBin("6F820137308201333081EC06072A8648CE3D02013081E0020101302C06072A8648CE3D0101022100A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377304404207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9042026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B60441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997022100A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7020101034200049BD24313046EB43CC4652B6FC1AA00E76B5405F4E7016521E95BE53B9C5BAE5A1410F12CF3AE23F886EFCEDE89F7C63AD9CA9E5C6C05DE902DB70F2EB2341F9D")
|
|
115
|
+
let dgp = DataGroupParser()
|
|
116
|
+
|
|
117
|
+
XCTAssertNoThrow(try dgp.parseDG(data: dg15Val)) { dg in
|
|
118
|
+
XCTAssertNotNil(dg)
|
|
119
|
+
XCTAssertTrue( dg is DataGroup15 )
|
|
120
|
+
|
|
121
|
+
let dg15 = dg as? DataGroup15
|
|
122
|
+
XCTAssertTrue( dg15?.ecdsaPublicKey != nil || dg15?.rsaPublicKey != nil )
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
func testCOMDatagroupParsing() {
|
|
128
|
+
let com = hexRepToBin("601A5F0104303130375F36063034303030305C08617563676B6C6E6F")
|
|
129
|
+
let dgp = DataGroupParser()
|
|
130
|
+
XCTAssertNoThrow(try dgp.parseDG(data: com)) { dg in
|
|
131
|
+
XCTAssertNotNil(dg)
|
|
132
|
+
XCTAssertTrue( dg is COM )
|
|
133
|
+
guard let com = dg as? COM else { XCTFail(); return }
|
|
134
|
+
|
|
135
|
+
// Version should be 0x30313037 or [0x30, 0x31, 0x30, 0x37]
|
|
136
|
+
XCTAssertEqual( com.version, "1.7")
|
|
137
|
+
|
|
138
|
+
// Unicode version should be 0x303430303030 or [0x30, 0x34, 0x30, 0x30, 0x30, 0x30]
|
|
139
|
+
XCTAssertEqual( com.unicodeVersion, "4.0.0")
|
|
140
|
+
|
|
141
|
+
// Datagroups present are COM, DG1, DG2, DG3, DG7, DG11, DG12, DG14, DG15
|
|
142
|
+
XCTAssertEqual( com.dataGroupsPresent,["DG1", "DG2", "DG3", "DG7", "DG11", "DG12", "DG14", "DG15"])
|
|
143
|
+
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
func testItShouldThrowAnErrorWhenActualTagDoesNotMatchExpectedTag() throws {
|
|
148
|
+
let sut = try DataGroup([1, 2])
|
|
149
|
+
let expected = 1
|
|
150
|
+
let actual = 2
|
|
151
|
+
|
|
152
|
+
XCTAssertThrowsError(try sut.verifyTag(actual, equals: expected)) { error in
|
|
153
|
+
XCTAssertEqual("InvalidResponse in Unknown. Expected: 01 Actual: 02", error.localizedDescription)
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
func testItShouldNotThrowAnErrorWhenActualTagMatchesExpectedTag() throws {
|
|
158
|
+
let sut = try DataGroup([1, 2])
|
|
159
|
+
let expected = 1
|
|
160
|
+
let actual = 1
|
|
161
|
+
|
|
162
|
+
XCTAssertNoThrow(try sut.verifyTag(actual, equals: expected))
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
func testItShouldThrowAnErrorWhenActualTagIsNotAnExpectedTag() throws {
|
|
166
|
+
let sut = try DataGroup([1, 2])
|
|
167
|
+
let expected = [1, 3]
|
|
168
|
+
let actual = 2
|
|
169
|
+
|
|
170
|
+
XCTAssertThrowsError(try sut.verifyTag(actual, oneOf: expected)) { error in
|
|
171
|
+
XCTAssertEqual("InvalidResponse in Unknown. Expected: 01 Actual: 02", error.localizedDescription)
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
func testItShouldNotThrowAnErrorWhenActualTagIsAnExpectedTag() throws {
|
|
176
|
+
let sut = try DataGroup([1, 2])
|
|
177
|
+
let expected = [1, 3]
|
|
178
|
+
let actual = 3
|
|
179
|
+
|
|
180
|
+
XCTAssertNoThrow(try sut.verifyTag(actual, oneOf: expected))
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
static var allTests = [
|
|
184
|
+
("testDatagroup1Parsing", testDatagroup1Parsing),
|
|
185
|
+
("testDatagroup2Parsing", testDatagroup2ParsingJPEG2000),
|
|
186
|
+
("testDatagroup2ParsingJPEG", testDatagroup2ParsingJPEG),
|
|
187
|
+
("testCOMDatagroupParsing", testCOMDatagroupParsing)
|
|
188
|
+
]
|
|
189
|
+
}
|
package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderAppTests/Info.plist
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
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>CFBundleExecutable</key>
|
|
8
|
+
<string>$(EXECUTABLE_NAME)</string>
|
|
9
|
+
<key>CFBundleIdentifier</key>
|
|
10
|
+
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
|
11
|
+
<key>CFBundleInfoDictionaryVersion</key>
|
|
12
|
+
<string>6.0</string>
|
|
13
|
+
<key>CFBundleName</key>
|
|
14
|
+
<string>$(PRODUCT_NAME)</string>
|
|
15
|
+
<key>CFBundlePackageType</key>
|
|
16
|
+
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
|
17
|
+
<key>CFBundleShortVersionString</key>
|
|
18
|
+
<string>1.0</string>
|
|
19
|
+
<key>CFBundleVersion</key>
|
|
20
|
+
<string>1</string>
|
|
21
|
+
</dict>
|
|
22
|
+
</plist>
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import XCTest
|
|
2
|
+
import CoreNFC
|
|
3
|
+
import OpenSSL
|
|
4
|
+
|
|
5
|
+
@testable import NFCPassportReader
|
|
6
|
+
|
|
7
|
+
public func XCTAssertNoThrow<T>(_ expression: @autoclosure () throws -> T, _ message: String = "", file: StaticString = #file, line: UInt = #line, also validateResult: (T) -> Void) {
|
|
8
|
+
func executeAndAssignResult(_ expression: @autoclosure () throws -> T, to: inout T?) rethrows {
|
|
9
|
+
to = try expression()
|
|
10
|
+
}
|
|
11
|
+
var result: T?
|
|
12
|
+
XCTAssertNoThrow(try executeAndAssignResult(expression(), to: &result), message, file: file, line: line)
|
|
13
|
+
if let r = result {
|
|
14
|
+
validateResult(r)
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
final class NFCPassportReaderTests: XCTestCase {
|
|
20
|
+
|
|
21
|
+
func testBinToHexRep() {
|
|
22
|
+
let val : [UInt8] = [0x12, 0x24, 0x55, 0x77]
|
|
23
|
+
XCTAssertEqual( binToHexRep(val), "12245577" )
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
func testHexRepToBin() {
|
|
27
|
+
let val : [UInt8] = [0x12, 0x24, 0x55, 0x77]
|
|
28
|
+
XCTAssertEqual( hexRepToBin("12245577"), val )
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
func testAsn1Length() {
|
|
32
|
+
// Test < 127
|
|
33
|
+
XCTAssertNoThrow(try asn1Length([0x32])) { (len, offset) in
|
|
34
|
+
XCTAssertEqual(len, 0x32)
|
|
35
|
+
XCTAssertEqual(offset, 1)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Test 127
|
|
39
|
+
XCTAssertNoThrow(try asn1Length([0x7f])) { (len, offset) in
|
|
40
|
+
XCTAssertEqual(len, 0x7f)
|
|
41
|
+
XCTAssertEqual(offset, 1)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Test 128
|
|
45
|
+
XCTAssertNoThrow(try asn1Length([0x81, 0x80])) { (len, offset) in
|
|
46
|
+
XCTAssertEqual(len, 128)
|
|
47
|
+
XCTAssertEqual(offset, 2)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Test 255
|
|
51
|
+
XCTAssertNoThrow(try asn1Length([0x81, 0xFF])) { (len, offset) in
|
|
52
|
+
XCTAssertEqual(len, 255)
|
|
53
|
+
XCTAssertEqual(offset, 2)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Test 256
|
|
57
|
+
XCTAssertNoThrow(try asn1Length([0x82, 0x01,0x00])) { (len, offset) in
|
|
58
|
+
XCTAssertEqual(len, 256)
|
|
59
|
+
XCTAssertEqual(offset, 3)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Test 1000
|
|
63
|
+
XCTAssertNoThrow(try asn1Length([0x82, 0x03, 0xE8])) { (len, offset) in
|
|
64
|
+
XCTAssertEqual(len, 1000)
|
|
65
|
+
XCTAssertEqual(offset, 3)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Test Max value - 65535
|
|
69
|
+
XCTAssertNoThrow(try asn1Length([0x82, 0xff, 0xff])) { (len, offset) in
|
|
70
|
+
XCTAssertEqual(len, 65535)
|
|
71
|
+
XCTAssertEqual(offset, 3)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Test Too Big
|
|
75
|
+
XCTAssertThrowsError(try toAsn1Length(65536))
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
func testToASNLength() {
|
|
79
|
+
// Test < 127
|
|
80
|
+
XCTAssertNoThrow(try toAsn1Length(50)) { data in
|
|
81
|
+
XCTAssertEqual(data.count, 1)
|
|
82
|
+
XCTAssertEqual(data[0], 0x32)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Test 127
|
|
86
|
+
XCTAssertNoThrow(try toAsn1Length(127)) { data in
|
|
87
|
+
XCTAssertEqual(data.count, 1)
|
|
88
|
+
XCTAssertEqual(data[0], 0x7f)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Test 128
|
|
92
|
+
XCTAssertNoThrow(try toAsn1Length(128)) { data in
|
|
93
|
+
XCTAssertEqual(data.count, 2)
|
|
94
|
+
XCTAssertEqual(data[0], 0x81)
|
|
95
|
+
XCTAssertEqual(data[1], 0x80)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Test 255
|
|
99
|
+
XCTAssertNoThrow(try toAsn1Length(255)) { data in
|
|
100
|
+
XCTAssertEqual(data.count, 2)
|
|
101
|
+
XCTAssertEqual(data[0], 0x81)
|
|
102
|
+
XCTAssertEqual(data[1], 0xff)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Test 256
|
|
106
|
+
XCTAssertNoThrow(try toAsn1Length(256)) { data in
|
|
107
|
+
XCTAssertEqual(data.count, 3)
|
|
108
|
+
XCTAssertEqual(data[0], 0x82)
|
|
109
|
+
XCTAssertEqual(data[1], 0x01)
|
|
110
|
+
XCTAssertEqual(data[2], 0x00)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Test 1000
|
|
114
|
+
XCTAssertNoThrow(try toAsn1Length(1000)) { data in
|
|
115
|
+
XCTAssertEqual(data.count, 3)
|
|
116
|
+
XCTAssertEqual(data[0], 0x82)
|
|
117
|
+
XCTAssertEqual(data[1], 0x03)
|
|
118
|
+
XCTAssertEqual(data[2], 0xE8)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Test Max value - 65535
|
|
122
|
+
XCTAssertNoThrow(try toAsn1Length(65535)) { data in
|
|
123
|
+
XCTAssertEqual(data.count, 3)
|
|
124
|
+
XCTAssertEqual(data[0], 0x82)
|
|
125
|
+
XCTAssertEqual(data[1], 0xff)
|
|
126
|
+
XCTAssertEqual(data[2], 0xff)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Test Too Big
|
|
130
|
+
XCTAssertThrowsError(try toAsn1Length(65536))
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
func testDES3Encryption() {
|
|
135
|
+
let msg = [UInt8]("maryhadalittlelambaaaaaa".data(using: .utf8)!)
|
|
136
|
+
let iv : [UInt8] = [0, 0, 0, 0, 0, 0, 0, 0]
|
|
137
|
+
let key : [UInt8] = [191, 73, 56, 112, 158, 148, 146, 127, 157, 76, 117, 8, 239, 128, 87, 42]
|
|
138
|
+
let enc = tripleDESEncrypt(key: key, message: msg, iv: iv)
|
|
139
|
+
Log.debug("KEY: \(binToHexRep(key))")
|
|
140
|
+
Log.debug("MSG: \(binToHexRep(msg))")
|
|
141
|
+
Log.debug("ENC: \(binToHexRep(enc))")
|
|
142
|
+
|
|
143
|
+
XCTAssertEqual( binToHexRep(enc), "4DAF068AB358BC9E8F5E916D3DEDE750D92315370E44D9B3" )
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
func testDES3Decryption() {
|
|
147
|
+
let enc = hexRepToBin("4DAF068AB358BC9E8F5E916D3DEDE750D92315370E44D9B3")
|
|
148
|
+
let iv : [UInt8] = [0, 0, 0, 0, 0, 0, 0, 0]
|
|
149
|
+
let key : [UInt8] = [191, 73, 56, 112, 158, 148, 146, 127, 157, 76, 117, 8, 239, 128, 87, 42]
|
|
150
|
+
let dec = tripleDESDecrypt(key: key, message: enc, iv: iv)
|
|
151
|
+
Log.debug("KEY: \(binToHexRep(key))")
|
|
152
|
+
Log.debug("ENC: \(binToHexRep(enc))")
|
|
153
|
+
Log.debug("DEC: \(binToHexRep(dec))")
|
|
154
|
+
|
|
155
|
+
let val = String(data:Data(dec), encoding:.utf8)
|
|
156
|
+
XCTAssertEqual( val, "maryhadalittlelambaaaaaa" )
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
func testSecureMessagingProtect() {
|
|
160
|
+
|
|
161
|
+
let KSenc = hexRepToBin("8FDCFE759E40A4DF4575160B3BFB79FB")
|
|
162
|
+
let KSmac = hexRepToBin("2AE92531E55707D9C4CEF8C2D6E5AD70")
|
|
163
|
+
let ssc = hexRepToBin("73061884A0E57AA7")
|
|
164
|
+
|
|
165
|
+
let sm = SecureMessaging(ksenc: KSenc, ksmac: KSmac, ssc: ssc)
|
|
166
|
+
|
|
167
|
+
let data : [UInt8] = [0x00, 0xA4, 0x02, 0x0C, 0x02, 0x01, 0x01, 0x00]
|
|
168
|
+
let apdu = NFCISO7816APDU(data:Data(data))!
|
|
169
|
+
let protApdu = try! sm.protect( apdu: apdu )
|
|
170
|
+
|
|
171
|
+
XCTAssertNotNil(protApdu.data )
|
|
172
|
+
XCTAssertEqual( protApdu.instructionClass, 0x0c )
|
|
173
|
+
XCTAssertEqual( protApdu.instructionCode, 0xA4 )
|
|
174
|
+
XCTAssertEqual( protApdu.p1Parameter, 0x02 )
|
|
175
|
+
XCTAssertEqual( protApdu.p2Parameter, 0x0c )
|
|
176
|
+
|
|
177
|
+
let hexDataRep = binToHexRep( [UInt8](protApdu.data!))
|
|
178
|
+
XCTAssertEqual( hexDataRep, "870901CC69089F8F1AB4698E08B6334B3ABD5A9E09" )
|
|
179
|
+
XCTAssertEqual( protApdu.expectedResponseLength, 0 )
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
func testSecureMessagingUnprotectNoData() {
|
|
183
|
+
|
|
184
|
+
// Note - same keys as above but SSC incremented by 1 as per spec
|
|
185
|
+
let KSenc = hexRepToBin("8FDCFE759E40A4DF4575160B3BFB79FB")
|
|
186
|
+
let KSmac = hexRepToBin("2AE92531E55707D9C4CEF8C2D6E5AD70")
|
|
187
|
+
let ssc = hexRepToBin("73061884A0E57AA8")
|
|
188
|
+
|
|
189
|
+
let sm = SecureMessaging(ksenc: KSenc, ksmac: KSmac, ssc: ssc)
|
|
190
|
+
|
|
191
|
+
let data : [UInt8] = hexRepToBin("990290008E08C61E440E5DD415469000")
|
|
192
|
+
let protRespApdu = ResponseAPDU(data: data, sw1: 0x90, sw2: 0x00)
|
|
193
|
+
|
|
194
|
+
XCTAssertNoThrow(try sm.unprotect( rapdu: protRespApdu )) { rapdu in
|
|
195
|
+
XCTAssertEqual(binToHexRep(rapdu.data), "")
|
|
196
|
+
XCTAssertEqual( rapdu.sw1, 0x90 )
|
|
197
|
+
XCTAssertEqual( rapdu.sw2, 0x00 )
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
func testSecureMessagingUnprotectWithData() {
|
|
202
|
+
|
|
203
|
+
let KSenc = hexRepToBin("8FDCFE759E40A4DF4575160B3BFB79FB")
|
|
204
|
+
let KSmac = hexRepToBin("2AE92531E55707D9C4CEF8C2D6E5AD70")
|
|
205
|
+
let ssc = hexRepToBin("73061884A0E57AAA")
|
|
206
|
+
|
|
207
|
+
let sm = SecureMessaging(ksenc: KSenc, ksmac: KSmac, ssc: ssc)
|
|
208
|
+
|
|
209
|
+
let data : [UInt8] = hexRepToBin("87090156D0EFCC887F8973990290008E08D6B9C0DA21DC965F9000")
|
|
210
|
+
let protRespApdu = ResponseAPDU(data: data, sw1: 0x90, sw2: 0x00)
|
|
211
|
+
|
|
212
|
+
XCTAssertNoThrow(try sm.unprotect( rapdu: protRespApdu )) { rapdu in
|
|
213
|
+
XCTAssertEqual(binToHexRep(rapdu.data), "615B5F1F")
|
|
214
|
+
XCTAssertEqual( rapdu.sw1, 0x90 )
|
|
215
|
+
XCTAssertEqual( rapdu.sw2, 0x00 )
|
|
216
|
+
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
func testConvertECDSAPlainTODer() {
|
|
222
|
+
let sigText = "67e147aac644325792dfa0b1615956dc4ed54e8cd859341571db98003431936e0651e9a3cdbcea3c8accd75a6f6bf07eb6bcf9ad1728e21aa854049e634e6fbf"
|
|
223
|
+
let sig = hexRepToBin(sigText)
|
|
224
|
+
|
|
225
|
+
let ecsig = ECDSA_SIG_new()
|
|
226
|
+
defer { ECDSA_SIG_free(ecsig) }
|
|
227
|
+
sig.withUnsafeBufferPointer { (unsafeBufPtr) in
|
|
228
|
+
let unsafePointer = unsafeBufPtr.baseAddress!
|
|
229
|
+
let r = BN_bin2bn(unsafePointer, 32, nil)
|
|
230
|
+
let s = BN_bin2bn(unsafePointer + 32, 32, nil)
|
|
231
|
+
ECDSA_SIG_set0(ecsig, r, s)
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
//print( "Sig - \(ecsig)" )
|
|
235
|
+
|
|
236
|
+
var derEncodedSignature: UnsafeMutablePointer<UInt8>? = nil
|
|
237
|
+
let derLength = i2d_ECDSA_SIG(ecsig, &derEncodedSignature)
|
|
238
|
+
|
|
239
|
+
var derBytes = [UInt8](repeating: 0, count: Int(derLength))
|
|
240
|
+
for b in 0..<Int(derLength) {
|
|
241
|
+
derBytes[b] = derEncodedSignature![b]
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
XCTAssertNoThrow(try OpenSSLUtils.ASN1Parse(data: Data(derBytes)), "Successfully parsed" )
|
|
245
|
+
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
static var allTests = [
|
|
250
|
+
("testBinToHexRep", testBinToHexRep),
|
|
251
|
+
("testHexRepToBin", testHexRepToBin),
|
|
252
|
+
("testAsn1Length", testAsn1Length),
|
|
253
|
+
("testToASNLength", testToASNLength),
|
|
254
|
+
("testDES3Encryption", testDES3Encryption),
|
|
255
|
+
("testDES3Decryption", testDES3Decryption),
|
|
256
|
+
("testSecureMessagingProtect", testSecureMessagingProtect),
|
|
257
|
+
("testSecureMessagingUnprotectNoData", testSecureMessagingUnprotectNoData),
|
|
258
|
+
("testSecureMessagingUnprotectWithData", testSecureMessagingUnprotectWithData),
|
|
259
|
+
]
|
|
260
|
+
}
|