Changeset 771

Show
Ignore:
Timestamp:
12/13/06 17:09:13 (2 years ago)
Author:
mfenniak
Message:

adjust pdf decryption to work on internal objects including strings. it does not appear to decrypt strings as one would expect, but I'm not sure why.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • pypdf/trunk/pyPdf/pdf.py

    r770 r771  
    215215        self.read(stream) 
    216216        self.stream = stream 
     217        self._override_encryption = False 
    217218 
    218219    ## 
     
    346347        retval = readObject(self.stream, self) 
    347348 
    348         # if retval is a stream or string, it might be encrypted: 
    349         if isinstance(retval, StringObject) or isinstance(retval, StreamObject)
     349        # override encryption is used for the /Encrypt dictionary 
     350        if not self._override_encryption
    350351            # if we don't have the encryption key: 
    351352            if self.isEncrypted and not hasattr(self, '_decryption_key'): 
     
    359360            md5_hash = md5.new(key).digest() 
    360361            key = md5_hash[:min(16, len(self._decryption_key) + 5)] 
    361             if isinstance(retval, StringObject): 
    362                 retval = StringObject(utils.RC4_encrypt(key, retval)) 
    363             elif isinstance(retval, StreamObject): 
    364                 retval._data = utils.RC4_encrypt(key, retval._data) 
     362            #print repr(indirectReference) 
     363            retval = self._decryptObject(retval, key) 
    365364 
    366365        self.cacheIndirectObject(generation, idnum, retval) 
    367366        return retval 
     367 
     368    def _decryptObject(self, obj, key): 
     369        if isinstance(obj, StringObject): 
     370            #print len(obj), obj.encode("hex_codec") 
     371            obj = StringObject(utils.RC4_encrypt(key, obj)) 
     372            #print len(obj), repr(obj) 
     373        elif isinstance(obj, StreamObject): 
     374            obj._data = utils.RC4_encrypt(key, obj._data) 
     375        elif isinstance(obj, DictionaryObject): 
     376            for key, value in obj.items(): 
     377                #if key == '/Author' or key == '/Producer': 
     378                #    print repr(key), repr(value), repr(utils.RC4_encrypt(key, value)) 
     379                obj[key] = self._decryptObject(value, key) 
     380        elif isinstance(obj, ArrayObject): 
     381            for i in range(len(obj)): 
     382                obj[i] = self._decryptObject(obj[i], key) 
     383        return obj 
    368384 
    369385    def readObjectHeader(self, stream): 
     
    618634    # method. 
    619635    def decrypt(self, password): 
     636        self._override_encryption = True 
     637        try: 
     638            return self._decrypt(password) 
     639        finally: 
     640            self._override_encryption = False 
     641 
     642    def _decrypt(self, password): 
    620643        encrypt = self.safeGetObject(self.trailer['/Encrypt']) 
    621644        if encrypt['/Filter'] != '/Standard':