diff --git a/pymobiledevice3/restore/base_restore.py b/pymobiledevice3/restore/base_restore.py index 5398332be..41f94f786 100644 --- a/pymobiledevice3/restore/base_restore.py +++ b/pymobiledevice3/restore/base_restore.py @@ -71,3 +71,39 @@ def __init__(self, ipsw: ZipFile, device: Device, tss: Optional[dict] = None, @property def logger(self) -> logging.Logger: return logging.getLogger(f'{asyncio.current_task().get_name()}-{self.__class__.__module__}') + + def populate_tss_request_from_manifest(self, parameters: dict, additional_keys: Optional[list[str]] = None) -> None: + """ equivalent to idevicerestore:tss_parameters_add_from_manifest """ + key_list = ['ApBoardID', 'ApChipID'] + if additional_keys is None: + key_list += ['UniqueBuildID', 'Ap,OSLongVersion', 'Ap,OSReleaseType', 'Ap,ProductType', 'Ap,SDKPlatform', + 'Ap,SikaFuse', 'Ap,Target', 'Ap,TargetType', 'ApBoardID', 'ApChipID', + 'ApSecurityDomain', 'BMU,BoardID', 'BMU,ChipID', 'BbChipID', 'BbProvisioningManifestKeyHash', + 'BbActivationManifestKeyHash', 'BbCalibrationManifestKeyHash', 'Ap,ProductMarketingVersion', + 'BbFactoryActivationManifestKeyHash', 'BbFDRSecurityKeyHash', 'BbSkeyId', 'SE,ChipID', + 'Savage,ChipID', 'Savage,PatchEpoch', 'Yonkers,BoardID', 'Yonkers,ChipID', + 'Yonkers,PatchEpoch', 'Rap,BoardID', 'Rap,ChipID', 'Rap,SecurityDomain', 'Baobab,BoardID', + 'Baobab,ChipID', 'Baobab,ManifestEpoch', 'Baobab,SecurityDomain', 'eUICC,ChipID', + 'PearlCertificationRootPub', 'Timer,BoardID,1', 'Timer,BoardID,2', 'Timer,ChipID,1', + 'Timer,ChipID,2', 'Timer,SecurityDomain,1', 'Timer,SecurityDomain,2', 'Manifest', + ] + else: + key_list += additional_keys + + for k in key_list: + try: + v = self.build_identity[k] + if isinstance(v, str) and v.startswith('0x'): + v = int(v, 16) + parameters[k] = v + except KeyError: + pass + + if additional_keys is None: + # special treat for RequiresUIDMode + info = self.build_identity.get('Info') + if info is None: + return + requires_uid_mode = info.get('RequiresUIDMode') + if requires_uid_mode is not None: + parameters['RequiresUIDMode'] = requires_uid_mode diff --git a/pymobiledevice3/restore/recovery.py b/pymobiledevice3/restore/recovery.py index ec8a2d7e0..0b8bb57fa 100644 --- a/pymobiledevice3/restore/recovery.py +++ b/pymobiledevice3/restore/recovery.py @@ -44,7 +44,7 @@ def get_preboard_manifest(self): 'ApSupportsImg4': True, } - self.build_identity.populate_tss_request_parameters(parameters) + self.populate_tss_request_from_manifest(parameters) tss = TSSRequest() tss.add_common_tags(parameters, overrides) @@ -74,7 +74,7 @@ async def get_tss_response(self) -> TSSResponse: else: parameters['ApSupportsImg4'] = False - self.build_identity.populate_tss_request_parameters(parameters) + self.populate_tss_request_from_manifest(parameters) tss = TSSRequest() tss.add_common_tags(parameters) @@ -159,7 +159,7 @@ def get_local_policy_tss_response(self): else: parameters['ApSupportsImg4'] = False - self.build_identity.populate_tss_request_parameters(parameters) + self.populate_tss_request_from_manifest(parameters) # Add Ap,LocalPolicy lpol = { @@ -205,7 +205,7 @@ def get_recoveryos_root_ticket_tss_response(self): else: parameters['ApSupportsImg4'] = False - self.build_identity.populate_tss_request_parameters(parameters) + self.populate_tss_request_from_manifest(parameters) # create basic request # Adds @HostPlatformInfo, @VersionInfo, @UUID diff --git a/pymobiledevice3/restore/restore.py b/pymobiledevice3/restore/restore.py index 124970633..dede0def1 100644 --- a/pymobiledevice3/restore/restore.py +++ b/pymobiledevice3/restore/restore.py @@ -579,7 +579,7 @@ async def send_baseband_data(self, message: dict): parameters['BbGoldCertId'] = bb_cert_id parameters['BbSNUM'] = bb_snum - self.build_identity.populate_tss_request_parameters(parameters) + self.populate_tss_request_from_manifest(parameters) # create baseband request request = TSSRequest() @@ -721,7 +721,7 @@ async def get_se_firmware_data(self, updater_name: str, info: dict, arguments: d parameters = dict() # add manifest for current build_identity to parameters - self.build_identity.populate_tss_request_parameters(parameters) + self.populate_tss_request_from_manifest(parameters) # add SE,* tags from info dictionary to parameters parameters.update(info) @@ -747,7 +747,7 @@ async def get_yonkers_firmware_data(self, info: dict): parameters = dict() # add manifest for current build_identity to parameters - self.build_identity.populate_tss_request_parameters(parameters) + self.populate_tss_request_from_manifest(parameters) # add Yonkers,* tags from info dictionary to parameters parameters.update(info) @@ -785,7 +785,7 @@ async def get_savage_firmware_data(self, info: dict): parameters = dict() # add manifest for current build_identity to parameters - self.build_identity.populate_tss_request_parameters(parameters) + self.populate_tss_request_from_manifest(parameters) # add Savage,* tags from info dictionary to parameters parameters.update(info) @@ -826,7 +826,7 @@ async def get_rose_firmware_data(self, updater_name: str, info: dict, arguments: parameters = dict() # add manifest for current build_identity to parameters - self.build_identity.populate_tss_request_parameters(parameters) + self.populate_tss_request_from_manifest(parameters) parameters['ApProductionMode'] = True @@ -880,7 +880,7 @@ async def get_veridian_firmware_data(self, updater_name: str, info: dict, argume parameters = dict() # add manifest for current build_identity to parameters - self.build_identity.populate_tss_request_parameters(parameters) + self.populate_tss_request_from_manifest(parameters) # add BMU,* tags from info dictionary to parameters parameters.update(info) @@ -913,7 +913,7 @@ async def get_tcon_firmware_data(self, info: dict): parameters = dict() # add manifest for current build_identity to parameters - self.build_identity.populate_tss_request_parameters(parameters) + self.populate_tss_request_from_manifest(parameters) # add Baobab,* tags from info dictionary to parameters parameters.update(info) @@ -938,7 +938,7 @@ async def get_device_generated_firmware_data(self, updater_name: str, info: dict parameters = dict() # add manifest for current build_identity to parameters - self.build_identity.populate_tss_request_parameters( + self.populate_tss_request_from_manifest( parameters, arguments['DeviceGeneratedTags']['BuildIdentityTags']) parameters['@BBTicket'] = True @@ -981,7 +981,7 @@ async def get_timer_firmware_data(self, info: dict): parameters = dict() # add manifest for current build_identity to parameters - self.build_identity.populate_tss_request_parameters(parameters) + self.populate_tss_request_from_manifest(parameters) parameters['ApProductionMode'] = True if self.device.is_image4_supported: