Changeset 769

Show
Ignore:
Timestamp:
12/12/06 22:40:31 (2 years ago)
Author:
mfenniak
Message:

supports rev3+ owner keys

Files:

Legend:

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

    r768 r769  
    542542        return U 
    543543 
    544     def _alg33_1(self, password): 
     544    def _alg33_1(self, password, rev, keylen): 
    545545        import md5 
    546546        m = md5.new() 
    547547        password = (password + self._encryption_padding)[:32] 
    548548        m.update(password) 
    549         # alg 3.3 step 3 goes here, but isn't here yet 
    550549        md5_hash = m.digest() 
    551         key = md5_hash[:5] 
     550        if rev >= 3: 
     551            for i in range(50): 
     552                md5_hash = md5.new(md5_hash).digest() 
     553        key = md5_hash[:keylen] 
    552554        return key 
    553555 
     
    576578            print "User password accepted" 
    577579        else: 
    578             key = self._alg33_1(password) 
    579             # rev 2 only 
    580580            encrypt = self.safeGetObject(self.trailer['/Encrypt']) 
     581            rev = self.safeGetObject(encrypt['/R']) 
     582            if rev == 2: 
     583                keylen = 5 
     584            else: 
     585                keylen = self.safeGetObject(encrypt['/Length']) / 8 
     586            key = self._alg33_1(password, rev, keylen) 
    581587            real_O = self.safeGetObject(encrypt["/O"]) 
    582             userpass = utils.RC4_encrypt(key, real_O) 
     588            if rev == 2: 
     589                userpass = utils.RC4_encrypt(key, real_O) 
     590            else: 
     591                val = real_O 
     592                for i in range(19, -1, -1): 
     593                    new_key = '' 
     594                    for l in range(len(key)): 
     595                        new_key += chr(ord(key[l]) ^ i) 
     596                    val = utils.RC4_encrypt(new_key, val) 
     597                userpass = val 
    583598            owner_password = self._authenticateUserPassword(userpass) 
    584599            if owner_password: