from crypto.aes import AESdecryptCBC from firmware.img2 import IMG2 from firmware.img3 import Img3, extract_img3s from firmware.scfg import parse_SCFG from hfs.emf import EMFVolume from hfs.hfs import HFSVolume from image import NANDImageSplitCEs, NANDImageFlat from keystore.effaceable import check_effaceable_header, EffaceableLockers from legacyftl import FTL from partition_tables import GPT_partitions, parse_lwvm, parse_mbr, parse_gpt, \ APPLE_ENCRYPTED from progressbar import ProgressBar from remote import NANDRemote, IOFlashStorageKitClient from structs import * from util import sizeof_fmt, write_file, load_pickle, save_pickle, hexdump, \ makedirs from util.bdev import FTLBlockDevice from vfl import VFL from vsvfl import VSVFL from yaftl import YAFTL import math import os import plistlib import struct def ivForPage(page): iv = "" for _ in xrange(4): if (page & 1): page = 0x80000061 ^ (page >> 1); else: page = page >> 1; iv += struct.pack(" has a NOR)" vfltype = '1' #use VSVFL by default if not nandsig: nandsig = sp0.get("NANDDRIVERSIGN") if not nandsig: print "NANDDRIVERSIGN not found, assuming metadata withening = %d" % self.metadata_whitening else: nSig, flags = struct.unpack(" self.nCEs or page > self.pagesPerCE: #hax physical banking pass#raise Exception("CE %d Page %d out of bounds" % (ce, page)) if self.filename != "remote": #undo banking hax bank = (page & ~((1 << self.bank_mask) - 1)) >> self.bank_mask page2 = (page & ((1 << self.bank_mask) - 1)) page2 = bank * (self.blocks_per_bank) * self.pagesPerBlock + page2 spare, data = self.image.readPage(ce, page2) else: spare, data = self.image.readPage(ce, page) if not data: return None,None if self.metadata_whitening and spare != "\x00"*12 and len(spare) == 12: spare = self.unwhitenMetadata(spare, page) spare = spareType.parse(spare) if key and self.encrypted: if lpn != None: pageNum = spare.lpn #XXX else: pageNum = page return spare, self.decryptPage(data, key, pageNum) return spare, data def decryptPage(self, data, key, pageNum): return AESdecryptCBC(data, key, ivForPage(pageNum)) def unpackSpecialPage(self, data): l = struct.unpack("