def _parse_directory(self): self.directory_bitmap = util.bitrange(self.directory_bits, (0, 1), (1, 4)) self._parse_directory_bitmap() directory_format_revision = util.bitrange(self.directory_bits, (1, 3), (1, 0)) # Sector Chain Table for x in range(0, self.shell.max_sectors - 3): position = (16 + 5 * 8 * self.shell.max_directory_entries) + self.shell.psi * x entry_bits = self.directory_bits[position:position + self.shell.psi].uint self.sct[x + 1] = entry_bits # Directory Entries for x in range(1, self.shell.max_directory_entries): position = 16 + 5 * 8 * x entry_bits = self.directory_bits[position:position + 40] # Skip entry empties if entry_bits.uint == 0: continue entry = IPEDirectoryEntry(x, entry_bits, self.sct, self.shell.max_sectors) self.entries.append(entry) # Cyclic Log log_location = (16 + 5 * 8 * self.shell.max_directory_entries) log = self.directory_bits[log_location:log_location + 40] self.log = LogDirectoryEntry(log, self.sct, self.shell.max_sectors) sequence_location = (16 + 5 * 8 * self.shell.max_directory_entries ) + self.shell.sctl_size * 8 self.sequence = self.directory_bits[ sequence_location:sequence_location + 8].uint self.kid = self.directory_bits[sequence_location + 8:sequence_location + 12] self.shell_iteration = self.directory_bits[sequence_location + 12:sequence_location + 16].uint self.isamid = self.directory_bits[sequence_location + 16:sequence_location + 48]
def _parse_shell(self): self.shell_length = util.bitrange(self.shell_bits, (0, 7), (0, 2)).uint self.shell_bitmap = util.bitrange(self.shell_bits, (0, 1), (1, 4)) self._parse_shell_bitmap() shell_format_revision = util.bitrange(self.shell_bits, (1, 3), (1, 0)).hex # Compact shells only contain four basic fields. if self.shell_bitmap_type == self.TYPES.COMPACT: FVC = util.bitrange(self.shell_bits, (2, 0), (2, 7)).hex return isrn_iin = util.bitrange(self.shell_bits, (2, 7), (4, 0)) isrn_oid = util.bitrange(self.shell_bits, (5, 7), (6, 0)) isrn_issn = util.bitrange(self.shell_bits, (7, 7), (10, 4)) isrn_chd = util.bitrange(self.shell_bits, (10, 3), (10, 0)) isrn = isrn_iin + isrn_oid + isrn_issn + isrn_chd self.isrn = util.bcd_digits(isrn.bytes) self.FVC = util.bitrange(self.shell_bits, (11, 7), (11, 0)).uint self.KSC = util.bitrange(self.shell_bits, (12, 7), (12, 0)).uint self.KVC = util.bitrange(self.shell_bits, (13, 7), (13, 0)).uint expiry_bitrange = util.bitrange(self.shell_bits, (14, 5), (15, 0)) self.expiry = util.en1545_DATE_from(expiry_bitrange.uint) self.sector_size = util.bitrange(self.shell_bits, (16, 7), (16, 0)).uint self.max_sectors = util.bitrange(self.shell_bits, (17, 7), (17, 0)).uint self.psi = len('{0:b}'.format(self.max_sectors - 1)) self.max_directory_entries = util.bitrange(self.shell_bits, (18, 7), (18, 0)).uint self.sctl_size = util.bitrange(self.shell_bits, (19, 7), (19, 0)).uint if not self.shell_bitmap_mcrn: SECRC = util.bitrange(self.shell_bits, (22, 7), (23, 0)) else: # The Multi-application CM reference is padded with 0x and ends # in a check digit. These aren't part of the reference number, so # let's remove them. mcrn = util.bitrange(self.shell_bits, (20, 7), (29, 0)) mcrn.replace('0xf', '') self.mcrn = mcrn.hex[:-1] SECRC = util.bitrange(self.shell_bits, (30, 7), (31, 0))