summaryrefslogtreecommitdiffstats
path: root/src/idevicerestore.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/idevicerestore.c')
-rw-r--r--src/idevicerestore.c57
1 files changed, 28 insertions, 29 deletions
diff --git a/src/idevicerestore.c b/src/idevicerestore.c
index 00c35c1..f3fdbdc 100644
--- a/src/idevicerestore.c
+++ b/src/idevicerestore.c
@@ -64,7 +64,7 @@ int main(int argc, char* argv[]) {
int optindex = 0;
char* ipsw = NULL;
char* uuid = NULL;
- uint64_t ecid = 0;
+ int tss_enabled = 0;
// create an instance of our context
struct idevicerestore_client_t* client = (struct idevicerestore_client_t*) malloc(sizeof(struct idevicerestore_client_t));
@@ -149,7 +149,7 @@ int main(int argc, char* argv[]) {
// extract buildmanifest
plist_t buildmanifest = NULL;
info("Extracting BuildManifest from IPSW\n");
- if (ipsw_extract_build_manifest(ipsw, &buildmanifest) < 0) {
+ if (ipsw_extract_build_manifest(ipsw, &buildmanifest, &tss_enabled) < 0) {
error("ERROR: Unable to extract BuildManifest from %s\n", ipsw);
return -1;
}
@@ -157,16 +157,10 @@ int main(int argc, char* argv[]) {
/* print iOS information from the manifest */
build_manifest_print_information(buildmanifest);
- // devices are listed in order from oldest to newest
- // so we'll need their ECID
- if (client->device->index > DEVICE_IPOD2G) {
- debug("Getting device's ECID for TSS request\n");
- // fetch the device's ECID for the TSS request
- if (get_ecid(client, &client->ecid) < 0) {
- error("ERROR: Unable to find device ECID\n");
- return -1;
- }
- debug("Found ECID %llu\n", client->ecid);
+ if (client->flags & FLAG_CUSTOM) {
+ /* prevent signing custom firmware */
+ tss_enabled = 0;
+ info("Custom firmware requested. Disabled TSS request.\n");
}
// choose whether this is an upgrade or a restore (default to upgrade)
@@ -194,22 +188,29 @@ int main(int argc, char* argv[]) {
/* print information about current build identity */
build_identity_print_information(build_identity);
- if (client->flags & FLAG_CUSTOM > 0) {
- if (client->device->index > DEVICE_IPOD2G) {
- if (get_shsh_blobs(client, ecid, build_identity, &client->tss) < 0) {
- error("ERROR: Unable to get SHSH blobs for this device\n");
- return -1;
- }
+ /* retrieve shsh blobs if required */
+ if (tss_enabled) {
+ debug("Getting device's ECID for TSS request\n");
+ /* fetch the device's ECID for the TSS request */
+ if (get_ecid(client, &client->ecid) < 0) {
+ error("ERROR: Unable to find device ECID\n");
+ return -1;
}
+ info("Found ECID %llu\n", client->ecid);
- /* verify if we have tss records if required */
- if ((client->device->index > DEVICE_IPOD2G) && (client->tss == NULL)) {
- error("ERROR: Unable to proceed without a tss record.\n");
- plist_free(buildmanifest);
+ if (get_shsh_blobs(client, client->ecid, build_identity, &client->tss) < 0) {
+ error("ERROR: Unable to get SHSH blobs for this device\n");
return -1;
}
}
+ /* verify if we have tss records if required */
+ if ((tss_enabled) && (client->tss == NULL)) {
+ error("ERROR: Unable to proceed without a TSS record.\n");
+ plist_free(buildmanifest);
+ return -1;
+ }
+
// Extract filesystem from IPSW and return its name
char* filesystem = NULL;
if (ipsw_extract_filesystem(client->ipsw, build_identity, &filesystem) < 0) {
@@ -432,11 +433,6 @@ int get_cpid(struct idevicerestore_client_t* client, uint32_t* cpid) {
}
int get_ecid(struct idevicerestore_client_t* client, uint64_t* ecid) {
- if(client->device->index <= DEVICE_IPOD2G) {
- *ecid = 0;
- return 0;
- }
-
switch (client->mode->index) {
case MODE_NORMAL:
if (normal_get_ecid(client->uuid, ecid) < 0) {
@@ -494,13 +490,16 @@ int get_shsh_blobs(struct idevicerestore_client_t* client, uint64_t ecid, plist_
return -1;
}
- info("Sending TSS request\n");
+ info("Sending TSS request... ");
response = tss_send_request(request);
if (response == NULL) {
+ info("ERROR: Unable to send TSS request\n");
plist_free(request);
return -1;
}
+ info("received SHSH blobs\n");
+
plist_free(request);
*tss = response;
return 0;
@@ -556,7 +555,6 @@ int ipsw_get_component_by_path(const char* ipsw, plist_t tss, const char* path,
}
if (tss) {
- info("Signing img3...\n");
img3 = img3_parse_file(component_data, component_size);
if (img3 == NULL) {
error("ERROR: Unable to parse IMG3: %s\n", component_name);
@@ -572,6 +570,7 @@ int ipsw_get_component_by_path(const char* ipsw, plist_t tss, const char* path,
return -1;
}
+ info("Signing %s\n", component_name);
if (img3_replace_signature(img3, component_blob) < 0) {
error("ERROR: Unable to replace IMG3 signature\n");
free(component_blob);