pymobiledevice3 4.26.0__tar.gz → 4.26.1__tar.gz

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.

Potentially problematic release.


This version of pymobiledevice3 might be problematic. Click here for more details.

Files changed (227) hide show
  1. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/PKG-INFO +1 -1
  2. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/_version.py +3 -3
  3. pymobiledevice3-4.26.1/pymobiledevice3/ca.py +282 -0
  4. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/lockdown.py +23 -18
  5. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3.egg-info/PKG-INFO +1 -1
  6. pymobiledevice3-4.26.0/pymobiledevice3/ca.py +0 -53
  7. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/.gitattributes +0 -0
  8. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/.github/FUNDING.yml +0 -0
  9. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  10. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  11. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  12. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/.github/pull_request_template.md +0 -0
  13. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/.github/workflows/codeql.yml +0 -0
  14. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/.github/workflows/generate-executable.py +0 -0
  15. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/.github/workflows/markdown-lint.yml +0 -0
  16. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/.github/workflows/python-app.yml +0 -0
  17. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/.github/workflows/python-publish.yml +0 -0
  18. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/.gitignore +0 -0
  19. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/.pre-commit-config.yaml +0 -0
  20. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/CODE_OF_CONDUCT.md +0 -0
  21. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/CONTRIBUTING.md +0 -0
  22. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/LICENSE +0 -0
  23. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/README.md +0 -0
  24. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/example.gif +0 -0
  25. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/markdownlint-config.json +0 -0
  26. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/misc/DTServices-14.2.txt +0 -0
  27. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/misc/DTServices-14.5.txt +0 -0
  28. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/misc/RemoteXPC.md +0 -0
  29. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/misc/plist_sniffer.py +0 -0
  30. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/misc/pyinstaller.md +0 -0
  31. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/misc/remotexpc_sniffer.py +0 -0
  32. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/misc/understanding_idevice_protocol_layers.md +0 -0
  33. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/misc/usbmux_sniff.sh +0 -0
  34. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/__init__.py +0 -0
  35. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/__main__.py +0 -0
  36. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/bonjour.py +0 -0
  37. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/__init__.py +0 -0
  38. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/activation.py +0 -0
  39. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/afc.py +0 -0
  40. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/amfi.py +0 -0
  41. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/apps.py +0 -0
  42. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/backup.py +0 -0
  43. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/bonjour.py +0 -0
  44. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/cli_common.py +0 -0
  45. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/companion_proxy.py +0 -0
  46. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/completions.py +0 -0
  47. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/crash.py +0 -0
  48. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/developer.py +0 -0
  49. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/diagnostics.py +0 -0
  50. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/lockdown.py +0 -0
  51. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/mounter.py +0 -0
  52. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/notification.py +0 -0
  53. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/pcap.py +0 -0
  54. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/power_assertion.py +0 -0
  55. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/processes.py +0 -0
  56. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/profile.py +0 -0
  57. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/provision.py +0 -0
  58. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/remote.py +0 -0
  59. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/restore.py +0 -0
  60. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/springboard.py +0 -0
  61. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/syslog.py +0 -0
  62. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/usbmux.py +0 -0
  63. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/version.py +0 -0
  64. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/cli/webinspector.py +0 -0
  65. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/common.py +0 -0
  66. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/exceptions.py +0 -0
  67. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/irecv.py +0 -0
  68. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/irecv_devices.py +0 -0
  69. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/lockdown_service_provider.py +0 -0
  70. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/osu/__init__.py +0 -0
  71. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/osu/os_utils.py +0 -0
  72. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/osu/posix_util.py +0 -0
  73. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/osu/win_util.py +0 -0
  74. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/pair_records.py +0 -0
  75. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/remote/__init__.py +0 -0
  76. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/remote/common.py +0 -0
  77. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/remote/core_device/__init__.py +0 -0
  78. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/remote/core_device/app_service.py +0 -0
  79. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/remote/core_device/core_device_service.py +0 -0
  80. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/remote/core_device/device_info.py +0 -0
  81. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/remote/core_device/diagnostics_service.py +0 -0
  82. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/remote/core_device/file_service.py +0 -0
  83. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/remote/module_imports.py +0 -0
  84. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/remote/remote_service.py +0 -0
  85. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/remote/remote_service_discovery.py +0 -0
  86. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/remote/remotexpc.py +0 -0
  87. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/remote/tunnel_service.py +0 -0
  88. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/remote/utils.py +0 -0
  89. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/remote/xpc_message.py +0 -0
  90. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/resources/__init__.py +0 -0
  91. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/resources/dsc_uuid_map.json +0 -0
  92. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/resources/dsc_uuid_map.py +0 -0
  93. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/resources/firmware_notifications.py +0 -0
  94. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/resources/notifications.txt +0 -0
  95. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/resources/webinspector/element_attribute.js +0 -0
  96. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/resources/webinspector/element_clear.js +0 -0
  97. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/resources/webinspector/enter_fullscreen.js +0 -0
  98. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/resources/webinspector/find_nodes.js +0 -0
  99. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/resources/webinspector/focus.js +0 -0
  100. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/resources/webinspector/get_attribute.js +0 -0
  101. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/resources/webinspector/is_displayed.js +0 -0
  102. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/resources/webinspector/is_editable.js +0 -0
  103. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/resources/webinspector/is_enabled.js +0 -0
  104. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/restore/__init__.py +0 -0
  105. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/restore/asr.py +0 -0
  106. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/restore/base_restore.py +0 -0
  107. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/restore/consts.py +0 -0
  108. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/restore/device.py +0 -0
  109. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/restore/fdr.py +0 -0
  110. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/restore/ftab.py +0 -0
  111. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/restore/img4.py +0 -0
  112. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/restore/recovery.py +0 -0
  113. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/restore/restore.py +0 -0
  114. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/restore/restore_options.py +0 -0
  115. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/restore/restored_client.py +0 -0
  116. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/restore/tss.py +0 -0
  117. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/service_connection.py +0 -0
  118. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/__init__.py +0 -0
  119. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/accessibilityaudit.py +0 -0
  120. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/afc.py +0 -0
  121. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/amfi.py +0 -0
  122. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/companion.py +0 -0
  123. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/crash_reports.py +0 -0
  124. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/debugserver_applist.py +0 -0
  125. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/device_arbitration.py +0 -0
  126. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/device_link.py +0 -0
  127. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/diagnostics.py +0 -0
  128. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/dtfetchsymbols.py +0 -0
  129. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/dvt/__init__.py +0 -0
  130. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/dvt/dvt_secure_socket_proxy.py +0 -0
  131. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/dvt/dvt_testmanaged_proxy.py +0 -0
  132. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/dvt/instruments/__init__.py +0 -0
  133. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/dvt/instruments/activity_trace_tap.py +0 -0
  134. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/dvt/instruments/application_listing.py +0 -0
  135. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/dvt/instruments/condition_inducer.py +0 -0
  136. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/dvt/instruments/core_profile_session_tap.py +0 -0
  137. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/dvt/instruments/device_info.py +0 -0
  138. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/dvt/instruments/energy_monitor.py +0 -0
  139. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/dvt/instruments/graphics.py +0 -0
  140. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/dvt/instruments/location_simulation.py +0 -0
  141. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/dvt/instruments/location_simulation_base.py +0 -0
  142. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/dvt/instruments/network_monitor.py +0 -0
  143. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/dvt/instruments/notifications.py +0 -0
  144. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/dvt/instruments/process_control.py +0 -0
  145. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/dvt/instruments/screenshot.py +0 -0
  146. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/dvt/instruments/sysmontap.py +0 -0
  147. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/dvt/testmanaged/xcuitest.py +0 -0
  148. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/file_relay.py +0 -0
  149. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/heartbeat.py +0 -0
  150. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/house_arrest.py +0 -0
  151. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/installation_proxy.py +0 -0
  152. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/lockdown_service.py +0 -0
  153. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/misagent.py +0 -0
  154. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/mobile_activation.py +0 -0
  155. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/mobile_config.py +0 -0
  156. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/mobile_image_mounter.py +0 -0
  157. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/mobilebackup2.py +0 -0
  158. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/notification_proxy.py +0 -0
  159. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/os_trace.py +0 -0
  160. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/pcapd.py +0 -0
  161. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/power_assertion.py +0 -0
  162. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/preboard.py +0 -0
  163. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/remote_fetch_symbols.py +0 -0
  164. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/remote_server.py +0 -0
  165. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/restore_service.py +0 -0
  166. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/screenshot.py +0 -0
  167. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/simulate_location.py +0 -0
  168. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/springboard.py +0 -0
  169. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/syslog.py +0 -0
  170. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/web_protocol/__init__.py +0 -0
  171. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/web_protocol/alert.py +0 -0
  172. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/web_protocol/automation_session.py +0 -0
  173. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/web_protocol/cdp_screencast.py +0 -0
  174. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/web_protocol/cdp_server.py +0 -0
  175. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/web_protocol/cdp_target.py +0 -0
  176. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/web_protocol/driver.py +0 -0
  177. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/web_protocol/element.py +0 -0
  178. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/web_protocol/inspector_session.py +0 -0
  179. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/web_protocol/selenium_api.py +0 -0
  180. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/web_protocol/session_protocol.py +0 -0
  181. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/web_protocol/switch_to.py +0 -0
  182. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/services/webinspector.py +0 -0
  183. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/tcp_forwarder.py +0 -0
  184. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/tunneld/__init__.py +0 -0
  185. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/tunneld/api.py +0 -0
  186. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/tunneld/server.py +0 -0
  187. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/usbmux.py +0 -0
  188. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3/utils.py +0 -0
  189. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3.egg-info/SOURCES.txt +0 -0
  190. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3.egg-info/dependency_links.txt +0 -0
  191. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3.egg-info/entry_points.txt +0 -0
  192. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3.egg-info/requires.txt +0 -0
  193. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pymobiledevice3.egg-info/top_level.txt +0 -0
  194. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pyproject.toml +0 -0
  195. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/pytest.ini +0 -0
  196. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/requirements.txt +0 -0
  197. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/setup.cfg +0 -0
  198. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/__init__.py +0 -0
  199. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/cli/__init__.py +0 -0
  200. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/cli/test_cli.py +0 -0
  201. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/conftest.py +0 -0
  202. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/__init__.py +0 -0
  203. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/instruments/__init__.py +0 -0
  204. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/instruments/test_core_profile_session.py +0 -0
  205. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/instruments/test_dvt_secure_socket_proxy.py +0 -0
  206. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/instruments/test_fetch_symbols.py +0 -0
  207. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/instruments/test_location.py +0 -0
  208. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/instruments/test_screenshot.py +0 -0
  209. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/test_accessibility.py +0 -0
  210. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/test_afc.py +0 -0
  211. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/test_apps.py +0 -0
  212. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/test_backup2.py +0 -0
  213. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/test_bonjour.py +0 -0
  214. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/test_crash_reports.py +0 -0
  215. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/test_list_devices.py +0 -0
  216. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/test_lockdown.py +0 -0
  217. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/test_pcapd.py +0 -0
  218. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/test_springboard_services_relay.py +0 -0
  219. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/test_start_tunnel.py +0 -0
  220. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/test_syslog_relay.py +0 -0
  221. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/test_tcp_forwarder.py +0 -0
  222. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/test_web_protocol/__init__.py +0 -0
  223. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/test_web_protocol/common.py +0 -0
  224. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/test_web_protocol/conftest.py +0 -0
  225. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/test_web_protocol/test_driver.py +0 -0
  226. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/test_web_protocol/test_element.py +0 -0
  227. {pymobiledevice3-4.26.0 → pymobiledevice3-4.26.1}/tests/services/test_webinspector.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pymobiledevice3
3
- Version: 4.26.0
3
+ Version: 4.26.1
4
4
  Summary: Pure python3 implementation for working with iDevices (iPhone, etc...)
5
5
  Author-email: doronz88 <doron88@gmail.com>, matan <matan1008@gmail.com>
6
6
  Maintainer-email: doronz88 <doron88@gmail.com>, matan <matan1008@gmail.com>
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '4.26.0'
32
- __version_tuple__ = version_tuple = (4, 26, 0)
31
+ __version__ = version = '4.26.1'
32
+ __version_tuple__ = version_tuple = (4, 26, 1)
33
33
 
34
- __commit_id__ = commit_id = 'g3d245807a'
34
+ __commit_id__ = commit_id = 'gde0dd4c1e'
@@ -0,0 +1,282 @@
1
+ from datetime import datetime, timedelta, timezone
2
+ from pathlib import Path
3
+ from typing import Optional, Union
4
+
5
+ from cryptography import x509
6
+ from cryptography.hazmat.primitives import hashes, serialization
7
+ from cryptography.hazmat.primitives.asymmetric import rsa
8
+ from cryptography.hazmat.primitives.asymmetric.rsa import RSAPrivateKey, RSAPublicKey
9
+ from cryptography.hazmat.primitives.serialization import Encoding, NoEncryption, PrivateFormat, load_pem_public_key
10
+ from cryptography.x509 import Certificate
11
+ from cryptography.x509.oid import NameOID
12
+
13
+ _SERIAL = 1
14
+
15
+
16
+ def select_hash_algorithm(device_version: Union[tuple[int, int, int], str, None]) -> hashes.HashAlgorithm:
17
+ """
18
+ Choose hash algorithm to match libimobiledevice (idevicepair) logic.
19
+
20
+ :param device_version: Device version tuple (major, minor, patch) or "a.b.c" string.
21
+ If None, defaults to SHA-256 (modern).
22
+ :returns: SHA-1 if version < 4.0.0, else SHA-256.
23
+ """
24
+ if device_version is None:
25
+ return hashes.SHA256()
26
+ if isinstance(device_version, str):
27
+ parts = tuple(int(x) for x in device_version.split("."))
28
+ else:
29
+ parts = device_version
30
+ return hashes.SHA1() if parts < (4, 0, 0) else hashes.SHA256()
31
+
32
+
33
+ def get_validity_bounds(years: int = 10) -> tuple[datetime, datetime]:
34
+ """
35
+ Compute notBefore / notAfter validity window.
36
+
37
+ :param years: Number of years for certificate validity.
38
+ :returns: (not_before, not_after) in UTC.
39
+ """
40
+ now = datetime.now(timezone.utc)
41
+ return now - timedelta(minutes=1), now + timedelta(days=365 * years)
42
+
43
+
44
+ def serialize_cert_pem(cert: Certificate) -> bytes:
45
+ """
46
+ Serialize an X.509 certificate in PEM format.
47
+
48
+ :param cert: Certificate object.
49
+ :returns: PEM-encoded certificate bytes.
50
+ """
51
+ return cert.public_bytes(Encoding.PEM)
52
+
53
+
54
+ def serialize_private_key_pkcs8_pem(key: RSAPrivateKey) -> bytes:
55
+ """
56
+ Serialize a private key in PKCS#8 PEM format (like OpenSSL's PEM_write_bio_PrivateKey).
57
+
58
+ :param key: RSA private key.
59
+ :returns: PEM-encoded PKCS#8 key bytes (unencrypted).
60
+ """
61
+ return key.private_bytes(Encoding.PEM, PrivateFormat.PKCS8, NoEncryption())
62
+
63
+
64
+ # =======================================
65
+ # Certificate builders (empty DN, v3, KU)
66
+ # =======================================
67
+
68
+ def build_root_certificate(root_key: RSAPrivateKey, alg: hashes.HashAlgorithm) -> Certificate:
69
+ """
70
+ Build a self-signed root (CA) certificate:
71
+ - Empty subject/issuer (x509.Name([]))
72
+ - Serial = 1
73
+ - X.509 v3 with BasicConstraints CA:TRUE (critical)
74
+ - Signed with root_key using the chosen hash
75
+
76
+ :param root_key: RSA private key for the root CA.
77
+ :param alg: Hash algorithm (SHA-1 or SHA-256).
78
+ :returns: Root CA certificate.
79
+ """
80
+ not_before, not_after = get_validity_bounds()
81
+ empty = x509.Name([])
82
+ builder = (
83
+ x509.CertificateBuilder()
84
+ .subject_name(empty)
85
+ .issuer_name(empty)
86
+ .public_key(root_key.public_key())
87
+ .serial_number(_SERIAL)
88
+ .not_valid_before(not_before)
89
+ .not_valid_after(not_after)
90
+ .add_extension(x509.BasicConstraints(ca=True, path_length=None), critical=True)
91
+ )
92
+ return builder.sign(root_key, alg)
93
+
94
+
95
+ def build_host_certificate(
96
+ host_key: RSAPrivateKey,
97
+ root_cert: Certificate,
98
+ root_key: RSAPrivateKey,
99
+ alg: hashes.HashAlgorithm,
100
+ ) -> Certificate:
101
+ """
102
+ Build the host (leaf) certificate signed by the root:
103
+ - Empty subject
104
+ - Issuer = root's (empty) subject
105
+ - Serial = 1
106
+ - BasicConstraints CA:FALSE (critical)
107
+ - KeyUsage: digitalSignature, keyEncipherment (critical)
108
+ - Signed with root_key
109
+
110
+ :param host_key: Host RSA private key (leaf).
111
+ :param root_cert: Root CA certificate.
112
+ :param root_key: Root RSA private key.
113
+ :param alg: Hash algorithm (SHA-1 or SHA-256).
114
+ :returns: Host certificate (leaf).
115
+ """
116
+ not_before, not_after = get_validity_bounds()
117
+ builder = (
118
+ x509.CertificateBuilder()
119
+ .subject_name(x509.Name([]))
120
+ .issuer_name(root_cert.subject) # empty
121
+ .public_key(host_key.public_key())
122
+ .serial_number(_SERIAL)
123
+ .not_valid_before(not_before)
124
+ .not_valid_after(not_after)
125
+ .add_extension(x509.BasicConstraints(ca=False, path_length=None), critical=True)
126
+ .add_extension(
127
+ x509.KeyUsage(
128
+ digital_signature=True,
129
+ key_encipherment=True,
130
+ key_cert_sign=False, crl_sign=False,
131
+ content_commitment=False, data_encipherment=False,
132
+ key_agreement=False, encipher_only=False, decipher_only=False,
133
+ ),
134
+ critical=True,
135
+ )
136
+ )
137
+ return builder.sign(root_key, alg)
138
+
139
+
140
+ def build_device_certificate(
141
+ device_public_key: RSAPublicKey,
142
+ root_cert: Certificate,
143
+ root_key: RSAPrivateKey,
144
+ alg: hashes.HashAlgorithm,
145
+ ) -> Certificate:
146
+ """
147
+ Build the device certificate (leaf) signed by the root:
148
+ - Empty subject
149
+ - Issuer = root's (empty) subject
150
+ - Serial = 1
151
+ - BasicConstraints CA:FALSE (critical)
152
+ - KeyUsage: digitalSignature, keyEncipherment (critical)
153
+ - SubjectKeyIdentifier = hash
154
+ - Signed with root_key
155
+
156
+ :param device_public_key: Device's RSA public key (as advertised by lockdown).
157
+ :param root_cert: Root CA certificate.
158
+ :param root_key: Root RSA private key.
159
+ :param alg: Hash algorithm (SHA-1 or SHA-256).
160
+ :returns: Device certificate (leaf).
161
+ """
162
+ not_before, not_after = get_validity_bounds()
163
+ builder = (
164
+ x509.CertificateBuilder()
165
+ .subject_name(x509.Name([]))
166
+ .issuer_name(root_cert.subject) # empty
167
+ .public_key(device_public_key)
168
+ .serial_number(_SERIAL)
169
+ .not_valid_before(not_before)
170
+ .not_valid_after(not_after)
171
+ .add_extension(x509.BasicConstraints(ca=False, path_length=None), critical=True)
172
+ .add_extension(
173
+ x509.KeyUsage(
174
+ digital_signature=True,
175
+ key_encipherment=True,
176
+ key_cert_sign=False, crl_sign=False,
177
+ content_commitment=False, data_encipherment=False,
178
+ key_agreement=False, encipher_only=False, decipher_only=False,
179
+ ),
180
+ critical=True,
181
+ )
182
+ .add_extension(x509.SubjectKeyIdentifier.from_public_key(device_public_key), critical=False)
183
+ )
184
+ return builder.sign(root_key, alg)
185
+
186
+
187
+ # ==========================================
188
+ # Public API for your pairing flow (renamed)
189
+ # ==========================================
190
+
191
+ def generate_pairing_cert_chain(
192
+ device_public_key_pem: bytes,
193
+ private_key: Optional[RSAPrivateKey] = None,
194
+ device_version: Union[tuple[int, int, int], str, None] = (4, 0, 0),
195
+ ) -> tuple[bytes, bytes, bytes, bytes, bytes]:
196
+ """
197
+ Generate a root→host certificate chain and a device certificate that mirror the
198
+ libimobiledevice C behavior (empty DN, serial=1, BC/KU/SKI, SHA1 flip for < 4.0).
199
+
200
+ :param device_public_key_pem: Device RSA public key in PEM ("RSA PUBLIC KEY") format.
201
+ :param private_key: Optional host RSA private key to reuse; if None, a new one is generated.
202
+ :param device_version: Version to select hash (tuple or "a.b.c"). < 4.0.0 => SHA-1; else SHA-256.
203
+ :returns: (host_cert_pem, host_key_pem, device_cert_pem, root_cert_pem, root_key_pem)
204
+ """
205
+ alg = select_hash_algorithm(device_version)
206
+
207
+ # Root CA (self-signed)
208
+ root_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
209
+ root_cert = build_root_certificate(root_key, alg)
210
+
211
+ # Host leaf (reuse provided key if given)
212
+ host_key = private_key or rsa.generate_private_key(public_exponent=65537, key_size=2048)
213
+ host_cert = build_host_certificate(host_key, root_cert, root_key, alg)
214
+
215
+ # Device leaf (public key provided by the device)
216
+ dev_pub = load_pem_public_key(device_public_key_pem)
217
+ if not isinstance(dev_pub, RSAPublicKey):
218
+ raise ValueError("device_public_key_pem must be an RSA PUBLIC KEY in PEM format")
219
+ device_cert = build_device_certificate(dev_pub, root_cert, root_key, alg)
220
+
221
+ return (
222
+ serialize_cert_pem(host_cert),
223
+ serialize_private_key_pkcs8_pem(host_key),
224
+ serialize_cert_pem(device_cert),
225
+ serialize_cert_pem(root_cert),
226
+ serialize_private_key_pkcs8_pem(root_key),
227
+ )
228
+
229
+
230
+ def make_cert(key: RSAPrivateKey, public_key: RSAPublicKey, common_name: Optional[str] = None) -> Certificate:
231
+ """
232
+ Create a simple self-signed certificate for the provided key.
233
+
234
+ NOTE: This is not suitable for pairing (it sets subject/issuer and lacks C-style fields).
235
+ It is preserved as-is for your keybag usage.
236
+
237
+ :param key: RSA private key for signing.
238
+ :param public_key: RSA public key to embed in the certificate.
239
+ :param common_name: Optional CN to include in subject/issuer.
240
+ :returns: Self-signed certificate.
241
+ """
242
+ attributes = [x509.NameAttribute(NameOID.COMMON_NAME, common_name)] if common_name else []
243
+ subject = issuer = x509.Name(attributes)
244
+ cert = x509.CertificateBuilder()
245
+ cert = cert.subject_name(subject)
246
+ cert = cert.issuer_name(issuer)
247
+ cert = cert.public_key(public_key)
248
+ cert = cert.serial_number(1)
249
+ now = datetime.now()
250
+ now = now.replace(tzinfo=None)
251
+ cert = cert.not_valid_before(now - timedelta(minutes=1))
252
+ cert = cert.not_valid_after(now + timedelta(days=365 * 10))
253
+ cert = cert.sign(key, hashes.SHA256())
254
+ return cert
255
+
256
+
257
+ def dump_cert(cert: Certificate) -> bytes:
258
+ """
259
+ Serialize a certificate in PEM format.
260
+
261
+ :param cert: Certificate object.
262
+ :returns: PEM-encoded certificate bytes.
263
+ """
264
+ return cert.public_bytes(Encoding.PEM)
265
+
266
+
267
+ def create_keybag_file(file: Path, common_name: str) -> None:
268
+ """
269
+ Write a private key and a simple self-signed certificate to a file (PEM concatenated).
270
+
271
+ :param file: Destination file path.
272
+ :param common_name: Common Name to embed in the self-signed certificate.
273
+ """
274
+ private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
275
+ cer = make_cert(private_key, private_key.public_key(), common_name)
276
+ file.write_bytes(
277
+ private_key.private_bytes(
278
+ encoding=serialization.Encoding.PEM,
279
+ format=PrivateFormat.TraditionalOpenSSL,
280
+ encryption_algorithm=serialization.NoEncryption()
281
+ ) + cer.public_bytes(encoding=serialization.Encoding.PEM)
282
+ )
@@ -24,13 +24,13 @@ from packaging.version import Version
24
24
 
25
25
  from pymobiledevice3 import usbmux
26
26
  from pymobiledevice3.bonjour import DEFAULT_BONJOUR_TIMEOUT, browse_mobdev2
27
- from pymobiledevice3.ca import ca_do_everything
27
+ from pymobiledevice3.ca import generate_pairing_cert_chain
28
28
  from pymobiledevice3.common import get_home_folder
29
29
  from pymobiledevice3.exceptions import BadDevError, CannotStopSessionError, ConnectionFailedError, \
30
30
  ConnectionTerminatedError, DeviceNotFoundError, FatalPairingError, GetProhibitedError, IncorrectModeError, \
31
31
  InvalidConnectionError, InvalidHostIDError, InvalidServiceError, LockdownError, MissingValueError, \
32
32
  NoDeviceConnectedError, NotPairedError, PairingDialogResponsePendingError, PairingError, PasswordRequiredError, \
33
- SetProhibitedError, StartServiceError, UserDeniedPairingError
33
+ PyMobileDevice3Exception, SetProhibitedError, StartServiceError, UserDeniedPairingError
34
34
  from pymobiledevice3.irecv_devices import IRECV_DEVICES
35
35
  from pymobiledevice3.lockdown_service_provider import LockdownServiceProvider
36
36
  from pymobiledevice3.pair_records import create_pairing_records_cache_folder, generate_host_id, \
@@ -308,6 +308,7 @@ class LockdownClient(ABC, LockdownServiceProvider):
308
308
  if not response or response.get('Result') != 'Success':
309
309
  raise CannotStopSessionError()
310
310
  return response
311
+ raise PyMobileDevice3Exception('No active session')
311
312
 
312
313
  def validate_pairing(self) -> bool:
313
314
  if self.pair_record is None:
@@ -363,15 +364,17 @@ class LockdownClient(ABC, LockdownServiceProvider):
363
364
  raise PairingError()
364
365
 
365
366
  self.logger.info('Creating host key & certificate')
366
- cert_pem, private_key_pem, device_certificate = ca_do_everything(self.device_public_key,
367
- private_key=private_key)
368
-
369
- pair_record = {'DevicePublicKey': self.device_public_key,
370
- 'DeviceCertificate': device_certificate,
371
- 'HostCertificate': cert_pem,
367
+ host_cert_pem, host_key_pem, device_cert_pem, root_cert_pem, root_key_pem = generate_pairing_cert_chain(
368
+ self.device_public_key,
369
+ private_key=private_key
370
+ # TODO: consider parsing product_version to support iOS < 4
371
+ )
372
+
373
+ pair_record = {'DeviceCertificate': device_cert_pem,
374
+ 'HostCertificate': host_cert_pem,
372
375
  'HostID': self.host_id,
373
- 'RootCertificate': cert_pem,
374
- 'RootPrivateKey': private_key_pem,
376
+ 'RootCertificate': root_cert_pem,
377
+ 'RootPrivateKey': root_key_pem,
375
378
  'WiFiMACAddress': self.wifi_mac_address,
376
379
  'SystemBUID': self.system_buid}
377
380
 
@@ -380,7 +383,7 @@ class LockdownClient(ABC, LockdownServiceProvider):
380
383
 
381
384
  pair = self._request_pair(pair_options, timeout=timeout)
382
385
 
383
- pair_record['HostPrivateKey'] = private_key_pem
386
+ pair_record['HostPrivateKey'] = host_key_pem
384
387
  escrow_bag = pair.get('EscrowBag')
385
388
 
386
389
  if escrow_bag is not None:
@@ -405,14 +408,16 @@ class LockdownClient(ABC, LockdownServiceProvider):
405
408
  raise PairingError()
406
409
 
407
410
  self.logger.info('Creating host key & certificate')
408
- cert_pem, private_key_pem, device_certificate = ca_do_everything(self.device_public_key)
411
+ host_cert_pem, host_key_pem, device_cert_pem, root_cert_pem, root_key_pem = generate_pairing_cert_chain(
412
+ self.device_public_key
413
+ # TODO: consider parsing product_version to support iOS < 4
414
+ )
409
415
 
410
- pair_record = {'DevicePublicKey': self.device_public_key,
411
- 'DeviceCertificate': device_certificate,
412
- 'HostCertificate': cert_pem,
416
+ pair_record = {'DeviceCertificate': device_cert_pem,
417
+ 'HostCertificate': host_cert_pem,
413
418
  'HostID': self.host_id,
414
- 'RootCertificate': cert_pem,
415
- 'RootPrivateKey': private_key_pem,
419
+ 'RootCertificate': root_cert_pem,
420
+ 'RootPrivateKey': root_key_pem,
416
421
  'WiFiMACAddress': self.wifi_mac_address,
417
422
  'SystemBUID': self.system_buid}
418
423
 
@@ -434,7 +439,7 @@ class LockdownClient(ABC, LockdownServiceProvider):
434
439
  # second pair with Response to Challenge
435
440
  pair = self._request_pair(pair_options, timeout=timeout)
436
441
 
437
- pair_record['HostPrivateKey'] = private_key_pem
442
+ pair_record['HostPrivateKey'] = host_key_pem
438
443
  escrow_bag = pair.get('EscrowBag')
439
444
 
440
445
  if escrow_bag is not None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pymobiledevice3
3
- Version: 4.26.0
3
+ Version: 4.26.1
4
4
  Summary: Pure python3 implementation for working with iDevices (iPhone, etc...)
5
5
  Author-email: doronz88 <doron88@gmail.com>, matan <matan1008@gmail.com>
6
6
  Maintainer-email: doronz88 <doron88@gmail.com>, matan <matan1008@gmail.com>
@@ -1,53 +0,0 @@
1
- from datetime import datetime, timedelta
2
- from pathlib import Path
3
- from typing import Optional
4
-
5
- from cryptography import x509
6
- from cryptography.hazmat.primitives import hashes, serialization
7
- from cryptography.hazmat.primitives.asymmetric import rsa
8
- from cryptography.hazmat.primitives.asymmetric.rsa import RSAPrivateKey, RSAPublicKey
9
- from cryptography.hazmat.primitives.serialization import Encoding, NoEncryption, PrivateFormat, load_pem_public_key
10
- from cryptography.x509 import Certificate
11
- from cryptography.x509.oid import NameOID
12
-
13
-
14
- def make_cert(key: RSAPrivateKey, public_key: RSAPublicKey, common_name: Optional[str] = None) -> Certificate:
15
- attributes = [x509.NameAttribute(NameOID.COMMON_NAME, common_name)] if common_name else []
16
- subject = issuer = x509.Name(attributes)
17
- cert = x509.CertificateBuilder()
18
- cert = cert.subject_name(subject)
19
- cert = cert.issuer_name(issuer)
20
- cert = cert.public_key(public_key)
21
- cert = cert.serial_number(1)
22
- now = datetime.now()
23
- now = now.replace(tzinfo=None)
24
- cert = cert.not_valid_before(now - timedelta(minutes=1))
25
- cert = cert.not_valid_after(now + timedelta(days=365 * 10))
26
- cert = cert.sign(key, hashes.SHA256())
27
- return cert
28
-
29
-
30
- def dump_cert(cert):
31
- return cert.public_bytes(Encoding.PEM)
32
-
33
-
34
- def ca_do_everything(device_public_key, private_key: Optional[rsa.RSAPrivateKey] = None):
35
- if private_key is None:
36
- private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
37
-
38
- cert = make_cert(private_key, private_key.public_key())
39
- dev_key = load_pem_public_key(device_public_key)
40
- dev_cert = make_cert(private_key, dev_key, 'Device')
41
- return dump_cert(cert), private_key.private_bytes(Encoding.PEM, PrivateFormat.PKCS8, NoEncryption()), dump_cert(
42
- dev_cert)
43
-
44
-
45
- def create_keybag_file(file: Path, common_name: str) -> None:
46
- private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
47
- cer = make_cert(private_key, private_key.public_key(), common_name)
48
- file.write_bytes(
49
- private_key.private_bytes(
50
- encoding=serialization.Encoding.PEM,
51
- format=PrivateFormat.TraditionalOpenSSL,
52
- encryption_algorithm=serialization.NoEncryption()
53
- ) + cer.public_bytes(encoding=serialization.Encoding.PEM))