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
 
                                            % (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
 
         """
         c = len(self.buf)
         t = [self.buf]
-        good_crypto = 0
+        good_crypto = len (t)
         while c < size:
             todo = size
             if self.arcmode & ARCMODE_ENCRYPT:
                             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