@@ -104,6 +104,7 @@ int print_tss_request = 0;
104104int print_tss_response = 0 ;
105105int nocache = 0 ;
106106int save_shshblobs = 0 ;
107+ int save_bplist = 0 ;
107108const char * shshSavePath = "." DIRECTORY_DELIMITER_STR ;
108109
109110// iPhone & iPod touch (1st generations) do not use SHSH or APTicket.
@@ -1028,15 +1029,20 @@ int isManifestBufSignedForDevice(char *buildManifestBuffer, t_devicevals *devVal
10281029 plist_get_uint_val (pecid , & devVals -> ecid );
10291030 char * cecid = ecid_to_string (devVals -> ecid );
10301031
1031- uint32_t size = 0 ;
1032- char * data = NULL ;
10331032 if (* devVals -> generator )
10341033 plist_dict_set_item (apticket , "generator" , plist_new_string (devVals -> generator ));
10351034 if (apticket2 )
10361035 plist_dict_set_item (apticket , "updateInstall" , apticket2 );
10371036 if (apticket3 )
10381037 plist_dict_set_item (apticket , "noNonce" , apticket3 );
1039- plist_to_xml (apticket , & data , & size );
1038+
1039+ uint32_t size = 0 ;
1040+ char * data = NULL ;
1041+
1042+ if (save_bplist )
1043+ plist_to_bin (apticket , & data , & size );
1044+ else
1045+ plist_to_xml (apticket , & data , & size );
10401046
10411047 char * apnonce = "" ;
10421048 size_t apnonceLen = 0 ;
@@ -1056,22 +1062,19 @@ int isManifestBufSignedForDevice(char *buildManifestBuffer, t_devicevals *devVal
10561062 snprintf (tmpDevicename , tmpDeviceNameSize , "%s" , devVals -> deviceModel );
10571063 if (devVals -> deviceBoard ) snprintf (tmpDevicename + strlen (tmpDevicename ), tmpDeviceNameSize - strlen (tmpDevicename ), "_%s" ,devVals -> deviceBoard );
10581064
1059- size_t fnamelen = strlen (shshSavePath ) + 1 + strlen (cecid ) + tmpDeviceNameSize + strlen (cpvers ) + strlen (cbuild ) + strlen (DIRECTORY_DELIMITER_STR "___-.shsh2 " ) + 1 ;
1065+ size_t fnamelen = strlen (shshSavePath ) + 1 + strlen (cecid ) + tmpDeviceNameSize + strlen (cpvers ) + strlen (cbuild ) + strlen (DIRECTORY_DELIMITER_STR "___-.bshsh2 " ) + 1 ;
10601066 fnamelen += devVals -> parsedApnonceLen * 2 ;
10611067
10621068 char * fname = malloc (fnamelen );
10631069 memset (fname , 0 , fnamelen );
10641070 size_t prePathLen = strlen (shshSavePath );
10651071 if (shshSavePath [prePathLen - 1 ] == DIRECTORY_DELIMITER_CHR ) prePathLen -- ;
10661072 strncpy (fname , shshSavePath , prePathLen );
1067-
1068- snprintf (fname + prePathLen , fnamelen , DIRECTORY_DELIMITER_STR "%s_%s_%s-%s_%s.shsh%s" ,cecid ,tmpDevicename ,cpvers ,cbuild , apnonce , (* devVals -> generator || apticket2 ) ? "2" : "" );
1069-
1070-
1073+ snprintf (fname + prePathLen , fnamelen , DIRECTORY_DELIMITER_STR "%s_%s_%s-%s_%s.%Sshsh%s" ,cecid ,tmpDevicename ,cpvers ,cbuild , apnonce , save_bplist ? "b" : "" , (* devVals -> generator || apticket2 ) ? "2" : "" );
10711074 FILE * shshfile = fopen (fname , "wb" );
10721075 if (!shshfile ) error ("[Error] can't save shsh at %s\n" ,fname );
10731076 else {
1074- fwrite (data , strlen ( data ) , 1 , shshfile );
1077+ fwrite (data , size , 1 , shshfile );
10751078 fclose (shshfile );
10761079 info ("Saved shsh blobs!\n" );
10771080 }
0 commit comments