@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,224 @@
|
|
|
1
|
+
//
|
|
2
|
+
// ChipAuthenticationHandler.swift
|
|
3
|
+
// NFCPassportReader
|
|
4
|
+
//
|
|
5
|
+
// Created by Andy Qua on 25/02/2021.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
import OSLog
|
|
10
|
+
import OpenSSL
|
|
11
|
+
|
|
12
|
+
#if !os(macOS)
|
|
13
|
+
import CoreNFC
|
|
14
|
+
import CryptoKit
|
|
15
|
+
|
|
16
|
+
@available(iOS 15, *)
|
|
17
|
+
class ChipAuthenticationHandler {
|
|
18
|
+
|
|
19
|
+
private static let NO_PACE_KEY_REFERENCE : UInt8 = 0x00
|
|
20
|
+
private static let ENC_MODE : UInt8 = 0x1
|
|
21
|
+
private static let MAC_MODE : UInt8 = 0x2
|
|
22
|
+
private static let PACE_MODE : UInt8 = 0x3
|
|
23
|
+
|
|
24
|
+
private static let COMMAND_CHAINING_CHUNK_SIZE = 224
|
|
25
|
+
|
|
26
|
+
var tagReader : TagReader?
|
|
27
|
+
var gaSegments = [[UInt8]]()
|
|
28
|
+
|
|
29
|
+
var chipAuthInfos = [Int:ChipAuthenticationInfo]()
|
|
30
|
+
var chipAuthPublicKeyInfos = [ChipAuthenticationPublicKeyInfo]()
|
|
31
|
+
|
|
32
|
+
var isChipAuthenticationSupported : Bool = false
|
|
33
|
+
|
|
34
|
+
public init(dg14 : DataGroup14, tagReader: TagReader) {
|
|
35
|
+
self.tagReader = tagReader
|
|
36
|
+
|
|
37
|
+
for secInfo in dg14.securityInfos {
|
|
38
|
+
if let cai = secInfo as? ChipAuthenticationInfo {
|
|
39
|
+
let keyId = cai.getKeyId()
|
|
40
|
+
chipAuthInfos[keyId] = cai
|
|
41
|
+
} else if let capki = secInfo as? ChipAuthenticationPublicKeyInfo {
|
|
42
|
+
chipAuthPublicKeyInfos.append(capki)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if chipAuthPublicKeyInfos.count > 0 {
|
|
47
|
+
isChipAuthenticationSupported = true
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public func doChipAuthentication() async throws {
|
|
52
|
+
|
|
53
|
+
Logger.chipAuth.info( "Performing Chip Authentication - number of public keys found - \(self.chipAuthPublicKeyInfos.count)" )
|
|
54
|
+
guard isChipAuthenticationSupported else {
|
|
55
|
+
throw NFCPassportReaderError.NotYetSupported( "ChipAuthentication not supported" )
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
var success = false
|
|
59
|
+
for pubKey in chipAuthPublicKeyInfos {
|
|
60
|
+
do {
|
|
61
|
+
success = try await self.doChipAuthentication( with: pubKey)
|
|
62
|
+
if success {
|
|
63
|
+
break
|
|
64
|
+
}
|
|
65
|
+
} catch {
|
|
66
|
+
// try next key
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if !success {
|
|
71
|
+
throw NFCPassportReaderError.ChipAuthenticationFailed
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
private func doChipAuthentication( with chipAuthPublicKeyInfo : ChipAuthenticationPublicKeyInfo ) async throws -> Bool {
|
|
76
|
+
|
|
77
|
+
// So it turns out that some passports don't have ChipAuthInfo items.
|
|
78
|
+
// So if we do have a ChipAuthInfo the we take the keyId (if present) and OID from there,
|
|
79
|
+
// BUT if we don't then we will try to infer the OID from the public key
|
|
80
|
+
let keyId = chipAuthPublicKeyInfo.keyId
|
|
81
|
+
let chipAuthInfoOID : String
|
|
82
|
+
if let chipAuthInfo = chipAuthInfos[keyId ?? 0] {
|
|
83
|
+
chipAuthInfoOID = chipAuthInfo.oid
|
|
84
|
+
} else {
|
|
85
|
+
if let oid = inferOID( fromPublicKeyOID:chipAuthPublicKeyInfo.oid) {
|
|
86
|
+
chipAuthInfoOID = oid
|
|
87
|
+
} else {
|
|
88
|
+
return false
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
try await self.doCA( keyId: keyId, encryptionDetailsOID: chipAuthInfoOID, publicKey: chipAuthPublicKeyInfo.pubKey )
|
|
93
|
+
return true
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/// Infer OID from public key type - Best guess seems to be to use 3DES_CBC_CBC for both ECDH and DH keys
|
|
97
|
+
/// Apparently works for French passports
|
|
98
|
+
private func inferOID(fromPublicKeyOID: String ) -> String? {
|
|
99
|
+
if fromPublicKeyOID == SecurityInfo.ID_PK_ECDH_OID {
|
|
100
|
+
Logger.chipAuth.warning("No ChipAuthenticationInfo - guessing its id-CA-ECDH-3DES-CBC-CBC");
|
|
101
|
+
return SecurityInfo.ID_CA_ECDH_3DES_CBC_CBC_OID
|
|
102
|
+
} else if fromPublicKeyOID == SecurityInfo.ID_PK_DH_OID {
|
|
103
|
+
Logger.chipAuth.warning("No ChipAuthenticationInfo - guessing its id-CA-DH-3DES-CBC-CBC");
|
|
104
|
+
return SecurityInfo.ID_CA_DH_3DES_CBC_CBC_OID
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
Logger.chipAuth.warning("No ChipAuthenticationInfo and unsupported ChipAuthenticationPublicKeyInfo public key OID \(fromPublicKeyOID)")
|
|
108
|
+
return nil;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
private func doCA( keyId: Int?, encryptionDetailsOID oid: String, publicKey: OpaquePointer) async throws {
|
|
112
|
+
|
|
113
|
+
// Generate Ephemeral Keypair from parameters from DG14 Public key
|
|
114
|
+
// This should work for both EC and DH keys
|
|
115
|
+
var ephemeralKeyPair : OpaquePointer? = nil
|
|
116
|
+
let pctx = EVP_PKEY_CTX_new(publicKey, nil)
|
|
117
|
+
EVP_PKEY_keygen_init(pctx)
|
|
118
|
+
EVP_PKEY_keygen(pctx, &ephemeralKeyPair)
|
|
119
|
+
EVP_PKEY_CTX_free(pctx)
|
|
120
|
+
|
|
121
|
+
// Send the public key to the passport
|
|
122
|
+
try await sendPublicKey(oid: oid, keyId: keyId, pcdPublicKey: ephemeralKeyPair!)
|
|
123
|
+
|
|
124
|
+
Logger.chipAuth.debug( "Public Key successfully sent to passport!" )
|
|
125
|
+
|
|
126
|
+
// Use our ephemeral private key and the passports public key to generate a shared secret
|
|
127
|
+
// (the passport with do the same thing with their private key and our public key)
|
|
128
|
+
let sharedSecret = OpenSSLUtils.computeSharedSecret(privateKeyPair:ephemeralKeyPair!, publicKey:publicKey)
|
|
129
|
+
|
|
130
|
+
// Now try to restart Secure Messaging using the new shared secret and
|
|
131
|
+
try restartSecureMessaging( oid : oid, sharedSecret : sharedSecret, maxTranceiveLength : 1, shouldCheckMAC : true)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
private func sendPublicKey(oid : String, keyId : Int?, pcdPublicKey : OpaquePointer) async throws {
|
|
135
|
+
let cipherAlg = try ChipAuthenticationInfo.toCipherAlgorithm(oid: oid)
|
|
136
|
+
guard let keyData = OpenSSLUtils.getPublicKeyData(from: pcdPublicKey) else {
|
|
137
|
+
throw NFCPassportReaderError.InvalidDataPassed("Unable to get public key data from public key" )
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if cipherAlg.hasPrefix("DESede") {
|
|
141
|
+
|
|
142
|
+
var idData : [UInt8] = []
|
|
143
|
+
if let keyId = keyId {
|
|
144
|
+
idData = intToBytes( val:keyId, removePadding:true)
|
|
145
|
+
idData = wrapDO( b:0x84, arr:idData)
|
|
146
|
+
}
|
|
147
|
+
let wrappedKeyData = wrapDO( b:0x91, arr:keyData)
|
|
148
|
+
_ = try await self.tagReader?.sendMSEKAT(keyData: Data(wrappedKeyData), idData: Data(idData))
|
|
149
|
+
} else if cipherAlg.hasPrefix("AES") {
|
|
150
|
+
_ = try await self.tagReader?.sendMSESetATIntAuth(oid: oid, keyId: keyId)
|
|
151
|
+
let data = wrapDO(b: 0x80, arr:keyData)
|
|
152
|
+
gaSegments = self.chunk(data: data, segmentSize: ChipAuthenticationHandler.COMMAND_CHAINING_CHUNK_SIZE )
|
|
153
|
+
try await self.handleGeneralAuthentication()
|
|
154
|
+
} else {
|
|
155
|
+
throw NFCPassportReaderError.InvalidDataPassed("Cipher Algorithm \(cipherAlg) not supported")
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
private func handleGeneralAuthentication() async throws {
|
|
160
|
+
repeat {
|
|
161
|
+
// Pull next segment from list
|
|
162
|
+
let segment = gaSegments.removeFirst()
|
|
163
|
+
let isLast = gaSegments.isEmpty
|
|
164
|
+
|
|
165
|
+
// send it
|
|
166
|
+
_ = try await self.tagReader?.sendGeneralAuthenticate(data: segment, isLast: isLast)
|
|
167
|
+
} while ( !gaSegments.isEmpty )
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
private func restartSecureMessaging( oid : String, sharedSecret : [UInt8], maxTranceiveLength : Int, shouldCheckMAC : Bool) throws {
|
|
171
|
+
let cipherAlg = try ChipAuthenticationInfo.toCipherAlgorithm(oid: oid)
|
|
172
|
+
let keyLength = try ChipAuthenticationInfo.toKeyLength(oid: oid)
|
|
173
|
+
|
|
174
|
+
// Start secure messaging.
|
|
175
|
+
let smskg = SecureMessagingSessionKeyGenerator()
|
|
176
|
+
let ksEnc = try smskg.deriveKey(keySeed: sharedSecret, cipherAlgName: cipherAlg, keyLength: keyLength, mode: .ENC_MODE)
|
|
177
|
+
let ksMac = try smskg.deriveKey(keySeed: sharedSecret, cipherAlgName: cipherAlg, keyLength: keyLength, mode: .MAC_MODE)
|
|
178
|
+
|
|
179
|
+
let ssc = withUnsafeBytes(of: 0.bigEndian, Array.init)
|
|
180
|
+
if (cipherAlg.hasPrefix("DESede")) {
|
|
181
|
+
Logger.chipAuth.info( "Restarting secure messaging using DESede encryption")
|
|
182
|
+
let sm = SecureMessaging(encryptionAlgorithm: .DES, ksenc: ksEnc, ksmac: ksMac, ssc: ssc)
|
|
183
|
+
tagReader?.secureMessaging = sm
|
|
184
|
+
} else if (cipherAlg.hasPrefix("AES")) {
|
|
185
|
+
Logger.chipAuth.info( "Restarting secure messaging using AES encryption")
|
|
186
|
+
let sm = SecureMessaging(encryptionAlgorithm: .AES, ksenc: ksEnc, ksmac: ksMac, ssc: ssc)
|
|
187
|
+
tagReader?.secureMessaging = sm
|
|
188
|
+
} else {
|
|
189
|
+
Logger.chipAuth.error( "Not restarting secure messaging as unsupported cipher algorithm requested - \(cipherAlg)")
|
|
190
|
+
throw NFCPassportReaderError.InvalidDataPassed("Unsupported cipher algorithm \(cipherAlg)" )
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
func inferDigestAlgorithmFromCipherAlgorithmForKeyDerivation( cipherAlg : String, keyLength : Int) throws -> String {
|
|
196
|
+
if cipherAlg == "DESede" || cipherAlg == "AES-128" {
|
|
197
|
+
return "SHA1"
|
|
198
|
+
}
|
|
199
|
+
if cipherAlg == "AES" && keyLength == 128 {
|
|
200
|
+
return "SHA1"
|
|
201
|
+
}
|
|
202
|
+
if cipherAlg == "AES-256" || cipherAlg == "AES-192" {
|
|
203
|
+
return "SHA256"
|
|
204
|
+
}
|
|
205
|
+
if cipherAlg == "AES" && (keyLength == 192 || keyLength == 256) {
|
|
206
|
+
return "SHA256"
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
throw NFCPassportReaderError.InvalidDataPassed("Unsupported cipher algorithm or key length")
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/// Chunks up a byte array into a number of segments of the given size,
|
|
213
|
+
/// and a final segment if there is a remainder.
|
|
214
|
+
/// - Parameter segmentSize the number of bytes per segment
|
|
215
|
+
/// - Parameter data the data to be partitioned
|
|
216
|
+
/// - Parameter a list with the segments
|
|
217
|
+
func chunk( data : [UInt8], segmentSize: Int ) -> [[UInt8]] {
|
|
218
|
+
return stride(from: 0, to: data.count, by: segmentSize).map {
|
|
219
|
+
Array(data[$0 ..< Swift.min($0 + segmentSize, data.count)])
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
#endif
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//
|
|
2
|
+
// DataGroupHash.swift
|
|
3
|
+
// NFCPassportReader
|
|
4
|
+
//
|
|
5
|
+
// Created by Andy Qua on 09/02/2021.
|
|
6
|
+
// Copyright © 2021 Andy Qua. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
@available(iOS 13, macOS 10.15, *)
|
|
10
|
+
public struct DataGroupHash {
|
|
11
|
+
public var id: String
|
|
12
|
+
public var sodHash: String
|
|
13
|
+
public var computedHash : String
|
|
14
|
+
public var match : Bool
|
|
15
|
+
}
|
|
16
|
+
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
//
|
|
2
|
+
// DataGroupParser.swift
|
|
3
|
+
//
|
|
4
|
+
// Created by Andy Qua on 14/06/2019.
|
|
5
|
+
//
|
|
6
|
+
|
|
7
|
+
import OpenSSL
|
|
8
|
+
|
|
9
|
+
@available(iOS 13, macOS 10.15, *)
|
|
10
|
+
class DataGroupParser {
|
|
11
|
+
|
|
12
|
+
static let dataGroupNames = ["Common", "DG1", "DG2", "DG3", "DG4", "DG5", "DG6", "DG7", "DG8", "DG9", "DG10", "DG11", "DG12", "DG13", "DG14", "DG15", "DG16", "SecurityData"]
|
|
13
|
+
static let tags : [UInt8] = [0x60, 0x61, 0x75, 0x63, 0x76, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x77]
|
|
14
|
+
static let classes : [DataGroup.Type] = [COM.self, DataGroup1.self, DataGroup2.self,
|
|
15
|
+
NotImplementedDG.self, NotImplementedDG.self, NotImplementedDG.self,
|
|
16
|
+
NotImplementedDG.self, DataGroup7.self, NotImplementedDG.self,
|
|
17
|
+
NotImplementedDG.self, NotImplementedDG.self, DataGroup11.self,
|
|
18
|
+
DataGroup12.self, NotImplementedDG.self, DataGroup14.self,
|
|
19
|
+
DataGroup15.self, NotImplementedDG.self, SOD.self]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
func parseDG( data : [UInt8] ) throws -> DataGroup {
|
|
23
|
+
|
|
24
|
+
let header = data[0..<4]
|
|
25
|
+
|
|
26
|
+
let dg = try tagToDG(header[0])
|
|
27
|
+
|
|
28
|
+
return try dg.init(data)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
func tagToDG( _ tag : UInt8 ) throws -> DataGroup.Type {
|
|
33
|
+
guard let index = DataGroupParser.tags.firstIndex(of: tag) else { throw NFCPassportReaderError.UnknownTag}
|
|
34
|
+
return DataGroupParser.classes[index]
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
//
|
|
2
|
+
// File.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Paul Philip Mitchell on 06/12/2021.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
|
|
10
|
+
@available(iOS 13, macOS 10.15, *)
|
|
11
|
+
public class ActiveAuthenticationInfo : SecurityInfo {
|
|
12
|
+
|
|
13
|
+
var oid : String
|
|
14
|
+
var version : Int
|
|
15
|
+
var signatureAlgorithmOID : String?
|
|
16
|
+
|
|
17
|
+
static func checkRequiredIdentifier(_ oid : String) -> Bool {
|
|
18
|
+
return ID_AA_OID == oid
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
init(oid: String, version: Int, signatureAlgorithmOID: String? = nil) {
|
|
22
|
+
self.oid = oid
|
|
23
|
+
self.version = version
|
|
24
|
+
self.signatureAlgorithmOID = signatureAlgorithmOID
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public override func getObjectIdentifier() -> String {
|
|
28
|
+
return oid
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public override func getProtocolOIDString() -> String {
|
|
32
|
+
return ActiveAuthenticationInfo.toProtocolOIDString(oid:oid)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public func getSignatureAlgorithmOIDString() -> String? {
|
|
36
|
+
return ActiveAuthenticationInfo.toSignatureAlgorithmOIDString(oid: signatureAlgorithmOID)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
private static func toProtocolOIDString(oid : String) -> String {
|
|
40
|
+
if ID_AA_OID == oid {
|
|
41
|
+
return "id-AA"
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return oid
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
private static func toSignatureAlgorithmOIDString(oid: String?) -> String? {
|
|
48
|
+
if (ECDSA_PLAIN_SHA1_OID == oid) {
|
|
49
|
+
return "ecdsa-plain-SHA1";
|
|
50
|
+
}
|
|
51
|
+
if (ECDSA_PLAIN_SHA224_OID == oid) {
|
|
52
|
+
return "ecdsa-plain-SHA224";
|
|
53
|
+
}
|
|
54
|
+
if (ECDSA_PLAIN_SHA256_OID == oid) {
|
|
55
|
+
return "ecdsa-plain-SHA256";
|
|
56
|
+
}
|
|
57
|
+
if (ECDSA_PLAIN_SHA384_OID == oid) {
|
|
58
|
+
return "ecdsa-plain-SHA384";
|
|
59
|
+
}
|
|
60
|
+
if (ECDSA_PLAIN_SHA512_OID == oid) {
|
|
61
|
+
return "ecdsa-plain-SHA512";
|
|
62
|
+
}
|
|
63
|
+
if (ECDSA_PLAIN_RIPEMD160_OID == oid) {
|
|
64
|
+
return "ecdsa-plain-RIPEMD160";
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return nil
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
//
|
|
2
|
+
// COM.swift
|
|
3
|
+
//
|
|
4
|
+
// Created by Andy Qua on 01/02/2021.
|
|
5
|
+
//
|
|
6
|
+
|
|
7
|
+
import Foundation
|
|
8
|
+
import OSLog
|
|
9
|
+
|
|
10
|
+
@available(iOS 13, macOS 10.15, *)
|
|
11
|
+
public class COM : DataGroup {
|
|
12
|
+
public private(set) var version : String = "Unknown"
|
|
13
|
+
public private(set) var unicodeVersion : String = "Unknown"
|
|
14
|
+
public private(set) var dataGroupsPresent : [String] = []
|
|
15
|
+
|
|
16
|
+
public override var datagroupType: DataGroupId { .COM }
|
|
17
|
+
|
|
18
|
+
required init( _ data : [UInt8] ) throws {
|
|
19
|
+
try super.init(data)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
override func parse(_ data: [UInt8]) throws {
|
|
23
|
+
var tag = try getNextTag()
|
|
24
|
+
try verifyTag(tag, equals: 0x5F01)
|
|
25
|
+
|
|
26
|
+
// Version is 4 bytes (ascii) - AABB
|
|
27
|
+
// AA is major number, BB is minor number
|
|
28
|
+
// e.g. 48 49 48 55 -> 01 07 -> 1.7
|
|
29
|
+
var versionBytes = try getNextValue()
|
|
30
|
+
if versionBytes.count == 4 {
|
|
31
|
+
let aa = Int( String(cString: Array(versionBytes[0..<2] + [0]) )) ?? -1
|
|
32
|
+
let bb = Int( String(cString: Array(versionBytes[2...] + [0])) ) ?? -1
|
|
33
|
+
if aa != -1 && bb != -1 {
|
|
34
|
+
version = "\(aa).\(bb)"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
tag = try getNextTag()
|
|
38
|
+
try verifyTag(tag, equals: 0x5F36)
|
|
39
|
+
|
|
40
|
+
versionBytes = try getNextValue()
|
|
41
|
+
if versionBytes.count == 6 {
|
|
42
|
+
let aa = Int( String(cString: Array(versionBytes[0..<2] + [0])) ) ?? -1
|
|
43
|
+
let bb = Int( String(cString: Array(versionBytes[2..<4] + [0])) ) ?? -1
|
|
44
|
+
let cc = Int( String(cString: Array(versionBytes[4...]) + [0]) ) ?? -1
|
|
45
|
+
if aa != -1 && bb != -1 && cc != -1 {
|
|
46
|
+
unicodeVersion = "\(aa).\(bb).\(cc)"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
tag = try getNextTag()
|
|
51
|
+
try verifyTag(tag, equals: 0x5C)
|
|
52
|
+
|
|
53
|
+
let vals = try getNextValue()
|
|
54
|
+
for v in vals {
|
|
55
|
+
if let index = DataGroupParser.tags.firstIndex(of: v) {
|
|
56
|
+
dataGroupsPresent.append( DataGroupParser.dataGroupNames[index] )
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
Logger.passportReader.debug( "DG Found - \(self.dataGroupsPresent)" )
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
//
|
|
2
|
+
// CardAccess.swift
|
|
3
|
+
// NFCPassportReader
|
|
4
|
+
//
|
|
5
|
+
// Created by Andy Qua on 03/03/2021.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
|
|
10
|
+
// SecurityInfos ::= SET of SecurityInfo
|
|
11
|
+
// SecurityInfo ::= SEQUENCE {
|
|
12
|
+
// protocol OBJECT IDENTIFIER,
|
|
13
|
+
// requiredData ANY DEFINED BY protocol,
|
|
14
|
+
// optionalData ANY DEFINED BY protocol OPTIONAL
|
|
15
|
+
@available(iOS 13, macOS 10.15, *)
|
|
16
|
+
public class CardAccess {
|
|
17
|
+
private var asn1 : ASN1Item!
|
|
18
|
+
public private(set) var securityInfos : [SecurityInfo] = [SecurityInfo]()
|
|
19
|
+
|
|
20
|
+
var paceInfo : PACEInfo? {
|
|
21
|
+
get {
|
|
22
|
+
return (securityInfos.filter { ($0 as? PACEInfo) != nil }).first as? PACEInfo
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
required init( _ data : [UInt8] ) throws {
|
|
27
|
+
let p = SimpleASN1DumpParser()
|
|
28
|
+
asn1 = try p.parse(data: Data(data))
|
|
29
|
+
|
|
30
|
+
// Bit of a hack at the moment - passing in the body - if we had a decent ASN1 parser then this would be better! ;)
|
|
31
|
+
for i in 0 ..< asn1.getNumberOfChildren() {
|
|
32
|
+
if let child = asn1.getChild(i),
|
|
33
|
+
let secInfo = SecurityInfo.getInstance( object:child, body : data ) {
|
|
34
|
+
securityInfos.append(secInfo)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/ChipAuthenticationInfo.swift
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
//
|
|
2
|
+
// ChipAuthenticationInfo.swift
|
|
3
|
+
// NFCPassportReader
|
|
4
|
+
//
|
|
5
|
+
// Created by Andy Qua on 25/02/2021.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
|
|
10
|
+
@available(iOS 13, macOS 10.15, *)
|
|
11
|
+
public class ChipAuthenticationInfo : SecurityInfo {
|
|
12
|
+
|
|
13
|
+
var oid : String
|
|
14
|
+
var version : Int
|
|
15
|
+
var keyId : Int?
|
|
16
|
+
|
|
17
|
+
static func checkRequiredIdentifier(_ oid : String) -> Bool {
|
|
18
|
+
return ID_CA_DH_3DES_CBC_CBC_OID == oid
|
|
19
|
+
|| ID_CA_ECDH_3DES_CBC_CBC_OID == oid
|
|
20
|
+
|| ID_CA_DH_AES_CBC_CMAC_128_OID == oid
|
|
21
|
+
|| ID_CA_DH_AES_CBC_CMAC_192_OID == oid
|
|
22
|
+
|| ID_CA_DH_AES_CBC_CMAC_256_OID == oid
|
|
23
|
+
|| ID_CA_ECDH_AES_CBC_CMAC_128_OID == oid
|
|
24
|
+
|| ID_CA_ECDH_AES_CBC_CMAC_192_OID == oid
|
|
25
|
+
|| ID_CA_ECDH_AES_CBC_CMAC_256_OID == oid
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
init(oid: String, version: Int, keyId: Int? = nil) {
|
|
29
|
+
self.oid = oid
|
|
30
|
+
self.version = version
|
|
31
|
+
self.keyId = keyId
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public override func getObjectIdentifier() -> String {
|
|
35
|
+
return oid
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public override func getProtocolOIDString() -> String {
|
|
39
|
+
return ChipAuthenticationInfo.toProtocolOIDString(oid:oid)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// The keyid refers to a specific key if there are multiple otherwise if not set, only one key is present so set to 0
|
|
43
|
+
public func getKeyId() -> Int {
|
|
44
|
+
return keyId ?? 0
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/// Returns the key agreement algorithm - DH or ECDH for the given Chip Authentication oid
|
|
48
|
+
/// - Parameter oid: the object identifier
|
|
49
|
+
/// - Returns: key agreement algorithm
|
|
50
|
+
/// - Throws: InvalidDataPassed error if invalid oid specified
|
|
51
|
+
public static func toKeyAgreementAlgorithm( oid : String ) throws -> String {
|
|
52
|
+
if ID_CA_DH_3DES_CBC_CBC_OID == oid
|
|
53
|
+
|| ID_CA_DH_AES_CBC_CMAC_128_OID == oid
|
|
54
|
+
|| ID_CA_DH_AES_CBC_CMAC_192_OID == oid
|
|
55
|
+
|| ID_CA_DH_AES_CBC_CMAC_256_OID == oid {
|
|
56
|
+
return "DH";
|
|
57
|
+
} else if ID_CA_ECDH_3DES_CBC_CBC_OID == oid
|
|
58
|
+
|| ID_CA_ECDH_AES_CBC_CMAC_128_OID == oid
|
|
59
|
+
|| ID_CA_ECDH_AES_CBC_CMAC_192_OID == oid
|
|
60
|
+
|| ID_CA_ECDH_AES_CBC_CMAC_256_OID == oid {
|
|
61
|
+
return "ECDH";
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
throw NFCPassportReaderError.InvalidDataPassed( "Unable to lookup key agreement algorithm - invalid oid" )
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/// Returns the cipher algorithm - DESede or AES for the given Chip Authentication oid
|
|
68
|
+
/// - Parameter oid: the object identifier
|
|
69
|
+
/// - Returns: the cipher algorithm type
|
|
70
|
+
/// - Throws: InvalidDataPassed error if invalid oid specified
|
|
71
|
+
public static func toCipherAlgorithm( oid : String ) throws -> String {
|
|
72
|
+
if ID_CA_DH_3DES_CBC_CBC_OID == oid
|
|
73
|
+
|| ID_CA_ECDH_3DES_CBC_CBC_OID == oid {
|
|
74
|
+
return "DESede";
|
|
75
|
+
} else if ID_CA_DH_AES_CBC_CMAC_128_OID == oid
|
|
76
|
+
|| ID_CA_DH_AES_CBC_CMAC_192_OID == oid
|
|
77
|
+
|| ID_CA_DH_AES_CBC_CMAC_256_OID == oid
|
|
78
|
+
|| ID_CA_ECDH_AES_CBC_CMAC_128_OID == oid
|
|
79
|
+
|| ID_CA_ECDH_AES_CBC_CMAC_192_OID == oid
|
|
80
|
+
|| ID_CA_ECDH_AES_CBC_CMAC_256_OID == oid {
|
|
81
|
+
return "AES";
|
|
82
|
+
}
|
|
83
|
+
throw NFCPassportReaderError.InvalidDataPassed( "Unable to lookup cipher algorithm - invalid oid" )
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/// Returns the key length in bits (128, 192, or 256) for the given Chip Authentication oid
|
|
87
|
+
/// - Parameter oid: the object identifier
|
|
88
|
+
/// - Returns: the key length in bits
|
|
89
|
+
/// - Throws: InvalidDataPassed error if invalid oid specified
|
|
90
|
+
public static func toKeyLength( oid : String ) throws -> Int {
|
|
91
|
+
if ID_CA_DH_3DES_CBC_CBC_OID == oid
|
|
92
|
+
|| ID_CA_ECDH_3DES_CBC_CBC_OID == oid
|
|
93
|
+
|| ID_CA_DH_AES_CBC_CMAC_128_OID == oid
|
|
94
|
+
|| ID_CA_ECDH_AES_CBC_CMAC_128_OID == oid {
|
|
95
|
+
return 128;
|
|
96
|
+
} else if ID_CA_DH_AES_CBC_CMAC_192_OID == oid
|
|
97
|
+
|| ID_CA_ECDH_AES_CBC_CMAC_192_OID == oid {
|
|
98
|
+
return 192;
|
|
99
|
+
} else if ID_CA_DH_AES_CBC_CMAC_256_OID == oid
|
|
100
|
+
|| ID_CA_ECDH_AES_CBC_CMAC_256_OID == oid {
|
|
101
|
+
return 256;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
throw NFCPassportReaderError.InvalidDataPassed( "Unable to get key length - invalid oid" )
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private static func toProtocolOIDString(oid : String) -> String {
|
|
108
|
+
if ID_CA_DH_3DES_CBC_CBC_OID == oid {
|
|
109
|
+
return "id-CA-DH-3DES-CBC-CBC"
|
|
110
|
+
}
|
|
111
|
+
if ID_CA_DH_AES_CBC_CMAC_128_OID == oid {
|
|
112
|
+
return "id-CA-DH-AES-CBC-CMAC-128"
|
|
113
|
+
}
|
|
114
|
+
if ID_CA_DH_AES_CBC_CMAC_192_OID == oid {
|
|
115
|
+
return "id-CA-DH-AES-CBC-CMAC-192"
|
|
116
|
+
}
|
|
117
|
+
if ID_CA_DH_AES_CBC_CMAC_256_OID == oid {
|
|
118
|
+
return "id-CA-DH-AES-CBC-CMAC-256"
|
|
119
|
+
}
|
|
120
|
+
if ID_CA_ECDH_3DES_CBC_CBC_OID == oid {
|
|
121
|
+
return "id-CA-ECDH-3DES-CBC-CBC"
|
|
122
|
+
}
|
|
123
|
+
if ID_CA_ECDH_AES_CBC_CMAC_128_OID == oid {
|
|
124
|
+
return "id-CA-ECDH-AES-CBC-CMAC-128"
|
|
125
|
+
}
|
|
126
|
+
if ID_CA_ECDH_AES_CBC_CMAC_192_OID == oid {
|
|
127
|
+
return "id-CA-ECDH-AES-CBC-CMAC-192"
|
|
128
|
+
}
|
|
129
|
+
if ID_CA_ECDH_AES_CBC_CMAC_256_OID == oid {
|
|
130
|
+
return "id-CA-ECDH-AES-CBC-CMAC-256"
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return oid
|
|
134
|
+
}
|
|
135
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
//
|
|
2
|
+
// ChipAuthenticationPublicKeyInfo.swift
|
|
3
|
+
// NFCPassportReader
|
|
4
|
+
//
|
|
5
|
+
// Created by Andy Qua on 25/02/2021.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
|
|
10
|
+
@available(iOS 13, macOS 10.15, *)
|
|
11
|
+
public class ChipAuthenticationPublicKeyInfo : SecurityInfo {
|
|
12
|
+
var oid : String
|
|
13
|
+
var pubKey : OpaquePointer
|
|
14
|
+
var keyId : Int?
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
static func checkRequiredIdentifier(_ oid : String) -> Bool {
|
|
18
|
+
return ID_PK_DH_OID == oid
|
|
19
|
+
|| ID_PK_ECDH_OID == oid
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
init(oid:String, pubKey:OpaquePointer, keyId: Int? = nil) {
|
|
23
|
+
self.oid = oid
|
|
24
|
+
self.pubKey = pubKey
|
|
25
|
+
self.keyId = keyId
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public override func getObjectIdentifier() -> String {
|
|
29
|
+
return oid
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public override func getProtocolOIDString() -> String {
|
|
33
|
+
return ChipAuthenticationPublicKeyInfo.toProtocolOIDString(oid:oid)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// The keyid refers to a specific key if there are multiple otherwise if not set, only one key is present so set to 0
|
|
37
|
+
public func getKeyId() -> Int {
|
|
38
|
+
return keyId ?? 0
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
private static func toProtocolOIDString(oid : String) -> String {
|
|
43
|
+
if ID_PK_DH_OID == oid {
|
|
44
|
+
return "id-PK-DH"
|
|
45
|
+
}
|
|
46
|
+
if ID_PK_ECDH_OID == oid {
|
|
47
|
+
return "id-PK-ECDH"
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return oid
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
}
|