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