コード例 #1
0
    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]
コード例 #2
0
    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))