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)
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)
def updateDigestFromRange(self, digest, start, len): fd = self.__getFdForRange(start, len) functions.updateDigestFromFile(digest, fd, len)