Пример #1
0
 def updateDigestFromRegion(self, digest, region, header_pos):
     if region is None or len(region) != 16:
         # What was the digest computed from?
         raise ValueError, "No region"
     (tag, type_, offset, count) = unpack("!2IiI", region)
     # FIXME: other regions than "immutable"?
     if (tag != 63 or type_ != RPM_BIN or -offset <= 0 or -offset % 16 != 0
             or count != 16):
         raise ValueError, "Invalid region"
     regionIndexEntries = -offset / 16
     if header_pos[0] is None:
         raise NotImplementedError
     fd = self.__getFdForRange(*header_pos)
     data = fd.read(16)
     if len(data) != 16:
         raise ValueError, "Unexpected EOF in header"
     (totalIndexEntries, totalDataSize) = unpack("!8x2I", data)
     data = fd.read(16 * totalIndexEntries)
     if len(data) != 16 * totalIndexEntries:
         raise ValueError, "Unexpected EOF in header"
     unsignedTags = []
     for i in xrange(totalIndexEntries):
         (tag, type_, offset, count) = \
               unpack("!4I", data[i * 16 : (i + 1) * 16])
         # FIXME: other regions than "immutable"?
         if tag == 63:
             break
         unsignedTags.append(tag)
     else:
         raise ValueError, "%s: immutable tag disappeared" % self.source
     if (type_ != RPM_BIN or count != 16
             or i + regionIndexEntries > totalIndexEntries):
         raise ValueError, "Invalid region tag"
     digest.update(pack("!2I", regionIndexEntries, offset + 16))
     digest.update(data[i * 16:(i + regionIndexEntries) * 16])
     for i in xrange(i + regionIndexEntries, totalIndexEntries):
         (tag, ) = unpack("!I", data[i * 16:i * 16 + 4])
         unsignedTags.append(tag)
     if unsignedTags:
         # FIXME: only once per package
         log.warning("%s: Unsigned tags %s", self.source,
                     [rpmtagname[i] for i in unsignedTags])
     # In practice region data starts at offset 0, but the original design
     # was proposing concatenated regions etc; where would the data region
     # start in that case? Lowest offset in region perhaps?
     functions.updateDigestFromFile(digest, fd, offset + 16)
Пример #2
0
Файл: io.py Проект: kholia/pyrpm
 def updateDigestFromRegion(self, digest, region, header_pos):
     if region is None or len(region) != 16:
         # What was the digest computed from?
         raise ValueError, "No region"
     (tag, type_, offset, count) = unpack("!2IiI", region)
     # FIXME: other regions than "immutable"?
     if (tag != 63 or type_ != RPM_BIN or -offset <= 0 or -offset % 16 != 0
         or count != 16):
         raise ValueError, "Invalid region"
     regionIndexEntries = -offset / 16
     if header_pos[0] is None:
         raise NotImplementedError
     fd = self.__getFdForRange(*header_pos)
     data = fd.read(16)
     if len(data) != 16:
         raise ValueError, "Unexpected EOF in header"
     (totalIndexEntries, totalDataSize) = unpack("!8x2I", data)
     data = fd.read(16 * totalIndexEntries)
     if len(data) != 16 * totalIndexEntries:
         raise ValueError, "Unexpected EOF in header"
     unsignedTags = []
     for i in xrange(totalIndexEntries):
         (tag, type_, offset, count) = \
               unpack("!4I", data[i * 16 : (i + 1) * 16])
         # FIXME: other regions than "immutable"?
         if tag == 63:
             break
         unsignedTags.append(tag)
     else:
         raise ValueError, "%s: immutable tag disappeared" % self.source
     if (type_ != RPM_BIN or count != 16 or
         i + regionIndexEntries > totalIndexEntries):
         raise ValueError, "Invalid region tag"
     digest.update(pack("!2I", regionIndexEntries, offset + 16))
     digest.update(data[i * 16 : (i + regionIndexEntries) * 16])
     for i in xrange(i + regionIndexEntries, totalIndexEntries):
         (tag,) = unpack("!I", data[i * 16 : i * 16 + 4])
         unsignedTags.append(tag)
     if unsignedTags:
         # FIXME: only once per package
         log.warning("%s: Unsigned tags %s",
                     self.source, [rpmtagname[i] for i in unsignedTags])
     # In practice region data starts at offset 0, but the original design
     # was proposing concatenated regions etc; where would the data region
     # start in that case? Lowest offset in region perhaps?
     functions.updateDigestFromFile(digest, fd, offset + 16)
Пример #3
0
 def updateDigestFromRange(self, digest, start, len):
     fd = self.__getFdForRange(start, len)
     functions.updateDigestFromFile(digest, fd, len)
Пример #4
0
Файл: io.py Проект: kholia/pyrpm
 def updateDigestFromRange(self, digest, start, len):
     fd = self.__getFdForRange(start, len)
     functions.updateDigestFromFile(digest, fd, len)