#pragma once #include #include #include #include #include #include #include namespace IdeviceFFI { using MobileImageMounterPtr = std::unique_ptr>; class MobileImageMounter { public: // Factory: connect via Provider static Result connect(Provider& provider); // Factory: wrap an existing Idevice socket (consumes it on success) static Result from_socket(Idevice&& socket); // Ops Result, FfiError> copy_devices(); Result, FfiError> lookup_image(std::string image_type); Result upload_image(std::string image_type, const uint8_t* image_data, size_t image_size, const uint8_t* signature_data, size_t signature_size); Result mount_image(std::string image_type, const uint8_t* signature_data, size_t signature_size, const uint8_t* trust_cache_data, size_t trust_cache_size, plist_t info_plist); Result unmount_image(std::string mount_path); Result query_developer_mode_status(); Result mount_developer(const uint8_t* image_data, size_t image_size, const uint8_t* signature_data, size_t signature_size); Result, FfiError> query_personalization_manifest( std::string image_type, const uint8_t* signature_data, size_t signature_size); Result, FfiError> query_nonce(std::string personalized_image_type); Result query_personalization_identifiers(std::string image_type); Result roll_personalization_nonce(); Result roll_cryptex_nonce(); Result mount_personalized(Provider& provider, const uint8_t* image_data, size_t image_size, const uint8_t* trust_cache_data, size_t trust_cache_size, const uint8_t* build_manifest_data, size_t build_manifest_size, plist_t info_plist, uint64_t unique_chip_id); Result mount_personalized_with_callback(Provider& provider, const uint8_t* image_data, size_t image_size, const uint8_t* trust_cache_data, size_t trust_cache_size, const uint8_t* build_manifest_data, size_t build_manifest_size, plist_t info_plist, uint64_t unique_chip_id, std::function& lambda); // RAII / moves ~MobileImageMounter() noexcept = default; MobileImageMounter(MobileImageMounter&&) noexcept = default; MobileImageMounter& operator=(MobileImageMounter&&) noexcept = default; MobileImageMounter(const MobileImageMounter&) = delete; MobileImageMounter& operator=(const MobileImageMounter&) = delete; ImageMounterHandle* raw() const noexcept { return handle_.get(); } static MobileImageMounter adopt(ImageMounterHandle* h) noexcept { return MobileImageMounter(h); } private: explicit MobileImageMounter(ImageMounterHandle* h) noexcept : handle_(h) {} MobileImageMounterPtr handle_{}; }; } // namespace IdeviceFFI