class EndOfFile (Exception):
"""Reached EOF."""
- pass
+ remainder = 0
+ msg = 0
+ def __init__ (self, n, msg=None):
+ self.remainder = n
+ self.msg = msg
class InvalidParameter (Exception):
def hdr_read_stream (instr):
data = instr.read(PDTCRYPT_HDR_SIZE)
- if len (data) != PDTCRYPT_HDR_SIZE:
- raise EndOfFile ("read: expected %d B, received %d B"
+ ldata = len (data)
+ if ldata != PDTCRYPT_HDR_SIZE:
+ raise EndOfFile (ldata,
+ "read: expected %d B, received %d B"
% (PDTCRYPT_HDR_SIZE, len (data)))
return hdr_read (data)
try:
hdr = hdr_read_stream (ins)
total_read += PDTCRYPT_HDR_SIZE
- except EndOfFile:
+ except EndOfFile as exn:
+ total_read += exn.remainder
if total_ct + total_obj * PDTCRYPT_HDR_SIZE != total_read:
raise PDTDecryptionError ("ciphertext processed (%d B) plus "
"overhead (%d Ć %d B) does not match "
nct = len (ct)
if nct < nexpect:
off = tell (ins)
- raise EndOfFile ("hit EOF after %d of %d B in block [%d:%d); "
+ raise EndOfFile (nct,
+ "hit EOF after %d of %d B in block [%d:%d); "
"%d B ciphertext remaining for object no %d"
% (nct, nexpect, off, off + nexpect, ctleft,
total_obj))
self.__enc_write(self.buf)
if close_fileobj is True:
- fixed = self._finalize_write_encrypt ()
+ if self.mode == "w":
+ # end of Tar archive marker (two empty blocks) was written
+ fixed = self._finalize_write_encrypt ()
if not self._extfileobj:
self.fileobj.close()
else:
self.lasthdr = self.fileobj.tell ()
try:
hdr = crypto.hdr_read_stream (self.fileobj)
- except crypto.EndOfFile:
+ except crypto.EndOfFile as exn:
+ if exn.remainder == 0:
+ raise EOFHeaderError("end of file header")
raise DecryptionError ("Crypto.hdr_read_stream(): hit EOF "
- "reading header %r" % (self.fileobj))
+ "reading header %r" % (self.fileobj)) \
+ from exn
except crypto.InvalidHeader:
raise DecryptionError ("Crypto.hdr_read_stream(): error ā%sā "
- "processing %r" % (hdr, self.fileobj))
+ "processing %r" % (hdr, self.fileobj)) \
+ from exn
self.remainder = hdr ["ctsize"] # distance to next header
return self.encryption.next (hdr)
"""
c = len(self.buf)
t = [self.buf]
- i = 0
while c < size:
- i += 1
todo = size
if self.encryption is not None:
if self.remainder <= 0: