diff options
| -rw-r--r-- | src/idevicerestore.c | 2 | ||||
| -rw-r--r-- | src/tss.c | 40 | ||||
| -rw-r--r-- | src/tss.h | 2 | 
3 files changed, 33 insertions, 11 deletions
| diff --git a/src/idevicerestore.c b/src/idevicerestore.c index 3026551..b4127a2 100644 --- a/src/idevicerestore.c +++ b/src/idevicerestore.c @@ -548,7 +548,7 @@ int get_shsh_blobs(struct idevicerestore_client_t* client, uint64_t ecid, plist_  	plist_t response = NULL;  	*tss = NULL; -	request = tss_create_request(build_identity, ecid); +	request = tss_create_request(build_identity, ecid, NULL, 0);  	if (request == NULL) {  		error("ERROR: Unable to create TSS request\n");  		return -1; @@ -27,6 +27,7 @@  #include "tss.h"  #include "img3.h" +#include "common.h"  #include "idevicerestore.h"  #define ECID_STRSIZE 0x20 @@ -36,7 +37,7 @@ typedef struct {  	char* content;  } tss_response; -plist_t tss_create_request(plist_t build_identity, uint64_t ecid) { +plist_t tss_create_request(plist_t build_identity, uint64_t ecid, unsigned char* nonce, int nonce_size) {  	uint64_t unique_build_size = 0;  	char* unique_build_data = NULL;  	plist_t unique_build_node = plist_dict_get_item(build_identity, "UniqueBuildID"); @@ -82,18 +83,28 @@ plist_t tss_create_request(plist_t build_identity, uint64_t ecid) {  		error("ERROR: Unable to get ECID\n");  		return NULL;  	} -	snprintf(ecid_string, ECID_STRSIZE, "%qu", ecid); +	snprintf(ecid_string, ECID_STRSIZE, "%qu", (long long unsigned int)ecid);  	// Add build information to TSS request  	plist_t tss_request = plist_new_dict(); +	plist_dict_insert_item(tss_request, "@APTicket", plist_new_bool(1)); +	plist_dict_insert_item(tss_request, "@BBTicket", plist_new_bool(1));  	plist_dict_insert_item(tss_request, "@HostIpAddress", plist_new_string("192.168.0.1")); -	plist_dict_insert_item(tss_request, "@HostPlatformInfo", plist_new_string("darwin")); -	plist_dict_insert_item(tss_request, "@VersionInfo", plist_new_string("3.8")); +	plist_dict_insert_item(tss_request, "@HostPlatformInfo", plist_new_string("mac"));  	plist_dict_insert_item(tss_request, "@Locality", plist_new_string("en_US")); -	plist_dict_insert_item(tss_request, "ApProductionMode", plist_new_bool(1)); -	plist_dict_insert_item(tss_request, "ApECID", plist_new_string(ecid_string)); -	plist_dict_insert_item(tss_request, "ApChipID", plist_new_uint(chip_id)); +	char* guid = generate_guid(); +	if (guid) { +		plist_dict_insert_item(tss_request, "@UUID", plist_new_string(guid)); +		free(guid); +	} +	plist_dict_insert_item(tss_request, "@VersionInfo", plist_new_string("libauthinstall-107.3"));  	plist_dict_insert_item(tss_request, "ApBoardID", plist_new_uint(board_id)); +	plist_dict_insert_item(tss_request, "ApChipID", plist_new_uint(chip_id)); +	plist_dict_insert_item(tss_request, "ApECID", plist_new_string(ecid_string)); +	if (nonce && (nonce_size > 0)) { +		plist_dict_insert_item(tss_request, "ApNonce", plist_new_data(nonce, nonce_size)); +	} +	plist_dict_insert_item(tss_request, "ApProductionMode", plist_new_bool(1));  	plist_dict_insert_item(tss_request, "ApSecurityDomain", plist_new_uint(security_domain));  	plist_dict_insert_item(tss_request, "UniqueBuildID", plist_new_data(unique_build_data, unique_build_size));  	free(unique_build_data); @@ -120,6 +131,11 @@ plist_t tss_create_request(plist_t build_identity, uint64_t ecid) {  			return NULL;  		} +		if (strcmp(key, "BasebandFirmware") == 0) { +			free(key); +			continue; +		} +  		plist_t tss_entry = plist_copy(manifest_entry);  		plist_dict_insert_item(tss_request, key, tss_entry);  		free(key); @@ -154,7 +170,9 @@ plist_t tss_send_request(plist_t tss_request) {  	CURL* handle = curl_easy_init();  	if (handle != NULL) {  		struct curl_slist* header = NULL; -		header = curl_slist_append(header, "Content-type: text/xml"); +		header = curl_slist_append(header, "Cache-Control: no-cache"); +		header = curl_slist_append(header, "Content-type: text/xml; charset=\"utf-8\""); +		header = curl_slist_append(header, "Expect:");  		response = malloc(sizeof(tss_response));  		if (response == NULL) { @@ -165,7 +183,7 @@ plist_t tss_send_request(plist_t tss_request) {  		response->length = 0;  		response->content = malloc(1); -		curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, &tss_write_callback); +		curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, (curl_write_callback)&tss_write_callback);  		curl_easy_setopt(handle, CURLOPT_WRITEDATA, response);  		curl_easy_setopt(handle, CURLOPT_HTTPHEADER, header);  		curl_easy_setopt(handle, CURLOPT_POSTFIELDS, request); @@ -185,6 +203,10 @@ plist_t tss_send_request(plist_t tss_request) {  	curl_global_cleanup();  	if (strstr(response->content, "MESSAGE=SUCCESS") == NULL) { +		error("ERROR: TSS request failed\n"); +		if (response->length > 0) { +			error("TSS server returned: %s\n", response->content); +		}	  		free(response->content);  		free(response);  		return NULL; @@ -29,7 +29,7 @@ extern "C" {  #include <plist/plist.h>  plist_t tss_send_request(plist_t request); -plist_t tss_create_request(plist_t build_identity, uint64_t ecid); +plist_t tss_create_request(plist_t build_identity, uint64_t ecid, unsigned char* nonce, int nonce_size);  int tss_get_entry_path(plist_t tss, const char* entry, char** path);  int tss_get_blob_by_path(plist_t tss, const char* path, char** blob);  int tss_get_blob_by_name(plist_t tss, const char* entry, char** blob); | 
