summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/idevicerestore.c34
-rw-r--r--src/ipsw.c5
-rw-r--r--src/ipsw.h2
-rw-r--r--src/recovery.c3
4 files changed, 27 insertions, 17 deletions
diff --git a/src/idevicerestore.c b/src/idevicerestore.c
index 50e2783..32dd736 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,9 +157,15 @@ int main(int argc, char* argv[]) {
/* print iOS information from the manifest */
build_manifest_print_information(buildmanifest);
+ if (client->flags & FLAG_CUSTOM) {
+ /* prevent signing custom firmware */
+ tss_enabled = 0;
+ info("Custom firmware requested. Disabled TSS request.\n");
+ }
+
// devices are listed in order from oldest to newest
// so we'll need their ECID
- if (client->device->index > DEVICE_IPOD2G) {
+ 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) {
@@ -194,22 +200,20 @@ 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;
- }
- }
-
- /* 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 (tss_enabled) {
+ 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) {
diff --git a/src/ipsw.c b/src/ipsw.c
index 9cd7290..d3f8839 100644
--- a/src/ipsw.c
+++ b/src/ipsw.c
@@ -173,10 +173,12 @@ int ipsw_extract_to_memory(const char* ipsw, const char* infile, char** pbuffer,
return 0;
}
-int ipsw_extract_build_manifest(const char* ipsw, plist_t* buildmanifest) {
+int ipsw_extract_build_manifest(const char* ipsw, plist_t* buildmanifest, int *tss_enabled) {
int size = 0;
char* data = NULL;
+ *tss_enabled = 0;
+
/* older devices don't require personalized firmwares and use a BuildManifesto.plist */
if (ipsw_extract_to_memory(ipsw, "BuildManifesto.plist", &data, &size) == 0) {
plist_from_xml(data, size, buildmanifest);
@@ -188,6 +190,7 @@ int ipsw_extract_build_manifest(const char* ipsw, plist_t* buildmanifest) {
/* whereas newer devices do not require personalized firmwares and use a BuildManifest.plist */
if (ipsw_extract_to_memory(ipsw, "BuildManifest.plist", &data, &size) == 0) {
+ *tss_enabled = 1;
plist_from_xml(data, size, buildmanifest);
return 0;
}
diff --git a/src/ipsw.h b/src/ipsw.h
index f1694ef..bd8ffc4 100644
--- a/src/ipsw.h
+++ b/src/ipsw.h
@@ -38,7 +38,7 @@ typedef struct {
} ipsw_file;
int ipsw_extract_to_memory(const char* ipsw, const char* infile, char** pbuffer, uint32_t* psize);
-int ipsw_extract_build_manifest(const char* ipsw, plist_t* buildmanifest);
+int ipsw_extract_build_manifest(const char* ipsw, plist_t* buildmanifest, int *tss_enabled);
void ipsw_free_file(ipsw_file* file);
#ifdef __cplusplus
diff --git a/src/recovery.c b/src/recovery.c
index 015e9ac..28256b5 100644
--- a/src/recovery.c
+++ b/src/recovery.c
@@ -228,6 +228,9 @@ int recovery_send_component(struct idevicerestore_client_t* client, plist_t buil
info("Resetting recovery mode connection...\n");
irecv_reset(client->recovery->client);
+ if (client->tss)
+ info("%s will be signed\n", component);
+
if (ipsw_get_component_by_path(client->ipsw, client->tss, path, &data, &size) < 0) {
error("ERROR: Unable to get component: %s\n", component);
free(path);