diff options
-rw-r--r-- | src/idevicerestore.c | 91 | ||||
-rw-r--r-- | src/idevicerestore.h | 7 | ||||
-rw-r--r-- | src/restore.c | 13 |
3 files changed, 20 insertions, 91 deletions
diff --git a/src/idevicerestore.c b/src/idevicerestore.c index 3892c73..192faef 100644 --- a/src/idevicerestore.c +++ b/src/idevicerestore.c @@ -824,14 +824,14 @@ int idevicerestore_start(struct idevicerestore_client_t* client) plist_dict_set_item(build_identity, "Manifest", manifest); } } else if (client->flags & FLAG_ERASE) { - build_identity = build_manifest_get_build_identity_for_model_with_restore_behavior(buildmanifest, client->device->hardware_model, "Erase"); + build_identity = build_manifest_get_build_identity_for_model_with_variant(buildmanifest, client->device->hardware_model, "Customer Erase Install (IPSW)"); if (build_identity == NULL) { error("ERROR: Unable to find any build identities\n"); plist_free(buildmanifest); return -1; } } else { - build_identity = build_manifest_get_build_identity_for_model_with_restore_behavior(buildmanifest, client->device->hardware_model, "Update"); + build_identity = build_manifest_get_build_identity_for_model_with_variant(buildmanifest, client->device->hardware_model, "Customer Upgrade Install (IPSW)"); if (!build_identity) { build_identity = build_manifest_get_build_identity_for_model(buildmanifest, client->device->hardware_model); } @@ -1962,7 +1962,7 @@ int get_sep_nonce(struct idevicerestore_client_t* client, unsigned char** nonce, return 0; } -plist_t build_manifest_get_build_identity_for_model_with_restore_behavior(plist_t build_manifest, const char *hardware_model, const char *behavior) +plist_t build_manifest_get_build_identity_for_model_with_variant(plist_t build_manifest, const char *hardware_model, const char *variant) { plist_t build_identities_array = plist_dict_get_item(build_manifest, "BuildIdentities"); if (!build_identities_array || plist_get_node_type(build_identities_array) != PLIST_ARRAY) { @@ -1992,86 +1992,13 @@ plist_t build_manifest_get_build_identity_for_model_with_restore_behavior(plist_ } free(str); str = NULL; - if (behavior) { - plist_t rbehavior = plist_dict_get_item(info_dict, "RestoreBehavior"); - if (!rbehavior || plist_get_node_type(rbehavior) != PLIST_STRING) { + if (variant) { + plist_t rvariant = plist_dict_get_item(info_dict, "Variant"); + if (!rvariant || plist_get_node_type(rvariant) != PLIST_STRING) { continue; } - plist_get_string_val(rbehavior, &str); - if (strcasecmp(str, behavior) != 0) { - free(str); - continue; - } else { - free(str); - return plist_copy(ident); - } - free(str); - } else { - return plist_copy(ident); - } - } - - return NULL; -} - -plist_t build_manifest_get_build_identity_for_model_with_restore_behavior_and_global_signing( - plist_t build_manifest, - const char *hardware_model, - const char *behavior, - uint8_t global_signing) -{ - plist_t build_identities_array = plist_dict_get_item(build_manifest, "BuildIdentities"); - if (!build_identities_array || plist_get_node_type(build_identities_array) != PLIST_ARRAY) { - error("ERROR: Unable to find build identities node\n"); - return NULL; - } - - uint32_t i; - for (i = 0; i < plist_array_get_size(build_identities_array); i++) { - plist_t ident = plist_array_get_item(build_identities_array, i); - if (!ident || plist_get_node_type(ident) != PLIST_DICT) { - continue; - } - plist_t info_dict = plist_dict_get_item(ident, "Info"); - if (!info_dict || plist_get_node_type(ident) != PLIST_DICT) { - continue; - } - plist_t devclass = plist_dict_get_item(info_dict, "DeviceClass"); - if (!devclass || plist_get_node_type(devclass) != PLIST_STRING) { - continue; - } - char *str = NULL; - plist_get_string_val(devclass, &str); - if (strcasecmp(str, hardware_model) != 0) { - free(str); - continue; - } - free(str); - str = NULL; - - plist_t global_signing_node = plist_dict_get_item(info_dict, "VariantSupportsGlobalSigning"); - if (!global_signing_node) { - if (global_signing) { - continue; - } - } else { - uint8_t is_global_signing; - plist_get_bool_val(global_signing_node, &is_global_signing); - - if (global_signing && !is_global_signing) { - continue; - } else if (!global_signing && is_global_signing) { - continue; - } - } - - if (behavior) { - plist_t rbehavior = plist_dict_get_item(info_dict, "RestoreBehavior"); - if (!rbehavior || plist_get_node_type(rbehavior) != PLIST_STRING) { - continue; - } - plist_get_string_val(rbehavior, &str); - if (strcasecmp(str, behavior) != 0) { + plist_get_string_val(rvariant, &str); + if (strcasecmp(str, variant) != 0) { free(str); continue; } else { @@ -2089,7 +2016,7 @@ plist_t build_manifest_get_build_identity_for_model_with_restore_behavior_and_gl plist_t build_manifest_get_build_identity_for_model(plist_t build_manifest, const char *hardware_model) { - return build_manifest_get_build_identity_for_model_with_restore_behavior(build_manifest, hardware_model, NULL); + return build_manifest_get_build_identity_for_model_with_variant(build_manifest, hardware_model, NULL); } int get_preboard_manifest(struct idevicerestore_client_t* client, plist_t build_identity, plist_t* manifest) diff --git a/src/idevicerestore.h b/src/idevicerestore.h index 0d90108..880f9ee 100644 --- a/src/idevicerestore.h +++ b/src/idevicerestore.h @@ -101,12 +101,7 @@ int build_manifest_get_identity_count(plist_t build_manifest); int build_manifest_check_compatibility(plist_t build_manifest, const char* product); void build_manifest_get_version_information(plist_t build_manifest, struct idevicerestore_client_t* client); plist_t build_manifest_get_build_identity_for_model(plist_t build_manifest, const char *hardware_model); -plist_t build_manifest_get_build_identity_for_model_with_restore_behavior(plist_t build_manifest, const char *hardware_model, const char *behavior); -plist_t build_manifest_get_build_identity_for_model_with_restore_behavior_and_global_signing( - plist_t build_manifest, - const char *hardware_model, - const char *behavior, - uint8_t global_signing); +plist_t build_manifest_get_build_identity_for_model_with_variant(plist_t build_manifest, const char *hardware_model, const char *variant); int build_manifest_get_build_count(plist_t build_manifest); void build_identity_print_information(plist_t build_identity); int build_identity_check_components_in_ipsw(plist_t build_identity, const char* ipsw); diff --git a/src/restore.c b/src/restore.c index d26f398..97ee18e 100644 --- a/src/restore.c +++ b/src/restore.c @@ -2802,16 +2802,23 @@ plist_t restore_get_build_identity(struct idevicerestore_client_t* client, uint8 { unsigned int size = 0; unsigned char* data = NULL; + const char *variant; plist_t buildmanifest = NULL; ipsw_extract_to_memory(client->ipsw, "BuildManifest.plist", &data, &size); plist_from_xml((char*)data, size, &buildmanifest); free(data); - plist_t build_identity = build_manifest_get_build_identity_for_model_with_restore_behavior_and_global_signing( + if (is_recover_os) + variant = "macOS Customer"; + else if (client->flags & FLAG_ERASE) + variant = "Customer Erase Install (IPSW)"; + else + variant = "Customer Upgrade Install (IPSW)"; + + plist_t build_identity = build_manifest_get_build_identity_for_model_with_variant( buildmanifest, client->device->hardware_model, - client->flags & FLAG_ERASE ? "Erase": "Update", - is_recover_os); + variant); plist_t unique_id_node = plist_dict_get_item(buildmanifest, "UniqueBuildID"); debug_plist(unique_id_node); |