diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/idevicerestore.c | 34 | ||||
| -rw-r--r-- | src/ipsw.c | 5 | ||||
| -rw-r--r-- | src/ipsw.h | 2 | ||||
| -rw-r--r-- | src/recovery.c | 3 | 
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) { @@ -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;  	} @@ -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); | 
