def _prepare_index(self): # Add space for file size self.index_offset += 8 # Space for num_signatures & num_additional_sections self.index_offset += 4 + 4 # Write the magic and placeholder for the index self.fileobj.write(b"MAR1" + packint(self.index_offset)) # Write placeholder for file size self.fileobj.write(struct.pack(">Q", 0)) # Write num_signatures self.fileobj.write(packint(len(self.signature_versions))) # Write placeholder signatures for algo_id, keyfile in self.signature_versions: sig = MarSignature(algo_id, keyfile) sig._offset = self.index_offset self.index_offset += sig.size self.signatures.append(sig) # algoid self.fileobj.write(packint(algo_id)) # numbytes self.fileobj.write(packint(sig.sigsize)) # space for signature self.fileobj.write("\0" * sig.sigsize) # Write placeholder for number of additional sections self.fileobj.write(packint(0))
def write(self, fp): if self.block_id == 1: mar_channel = self.info['MARChannelName'].encode('ascii') product_version = self.info['ProductVersion'].encode('ascii') data = mar_channel + b"\x00" + product_version + b"\x00" self.size = len(data) + 8 fp.write(packint(self.size)) fp.write(packint(self.block_id)) fp.write(data) else: raise ValueError("Unsupported additional info section: %s" % self.block_id)
def _write_index(self): """Writes the index of all members at the end of the file""" log.debug("rewriting index at %i", self.index_offset + 4) self.fileobj.seek(self.index_offset + 4) index_size = 0 for m in self.members: member_bytes = m.to_bytes() index_size += len(member_bytes) for m in self.members: member_bytes = m.to_bytes() self.fileobj.write(member_bytes) self.fileobj.seek(self.index_offset) self.fileobj.write(packint(index_size)) # Update the offset to the index self.fileobj.seek(4) self.fileobj.write(packint(self.index_offset))