catch bad parameter version in header
authorPhilipp Gesang <philipp.gesang@intra2net.com>
Mon, 14 Aug 2017 15:24:56 +0000 (17:24 +0200)
committerThomas Jarosch <thomas.jarosch@intra2net.com>
Mon, 2 Apr 2018 11:34:09 +0000 (13:34 +0200)
deltatar/crypto.py
deltatar/tarfile.py

index 92c0d8b..930d1f9 100755 (executable)
@@ -574,8 +574,8 @@ def kdf_by_version (paramversion=None, defs=None):
     if paramversion is not None:
         defs = ENCRYPTION_PARAMETERS.get(paramversion, None)
     if defs is None:
-        raise ValueError ("no encryption parameters for version %r"
-                % paramversion)
+        raise InvalidParameter ("no encryption parameters for version %r"
+                                % paramversion)
     (kdf, params) = defs["kdf"]
     fn = None
     if kdf == "scrypt" : fn = kdf_scrypt
index 2629e44..526c1ac 100644 (file)
@@ -872,7 +872,13 @@ class _Stream:
                                            % (self.enccounter, iv))
             self.lasthdr   = lasthdr
             self.remainder = hdr ["ctsize"] # distance to next header
-            self.encryption.next (hdr)
+            try:
+                self.encryption.next (hdr)
+            except crypto.InvalidParameter as exn:
+                raise DecryptionError ("Crypto.next(): error ā€œ%sā€ "
+                                       "processing %r at pos %d"
+                                       % (exn, self.fileobj, lasthdr)) \
+                      from exn
 
         return True
 
@@ -1011,7 +1017,7 @@ class _Stream:
         """
         c = len(self.buf)
         t = [self.buf]
-        good_crypto = 0
+        good_crypto = len (t)
         while c < size:
             todo = size
             if self.arcmode & ARCMODE_ENCRYPT:
@@ -1022,7 +1028,7 @@ class _Stream:
                             buf = None
                             break # while
                     except DecryptionError:
-                        if self.tolerant:
+                        if self.tolerant is True:
                             self.buf = b"".join (t [good_crypto:])
                             return b"".join (t [:good_crypto])
                         raise