Changeset 767

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

Making headway with encryption. For rev 2 files only, user and owner passwords can be authenticated. Next stop: rev 3 files.

Files:

Legend:

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

    r766 r767  
    532532        #    if document metadata is not being encrypted, pass \xff\xff\xff\xff into hash 
    533533        md5_hash = m.digest() 
    534         if rev >= 3: 
    535             for i in range(50): 
    536                 m = md5.new() 
    537                 m.update(md5_hash[:keylen]) 
    538                 md5_hash = m.digest() 
     534        #if rev >= 3: 
     535        #    for i in range(50): 
     536        #        m = md5.new() 
     537        #        m.update(md5_hash[:keylen]) 
     538        #        md5_hash = m.digest() 
    539539        return md5_hash[:keylen] 
    540540 
     
    547547        return U 
    548548 
     549    def _alg33_1(self, password): 
     550        import md5 
     551        m = md5.new() 
     552        password = (password + self._encryption_padding)[:32] 
     553        m.update(password) 
     554        # alg 3.3 step 3 goes here, but isn't here yet 
     555        md5_hash = m.digest() 
     556        key = md5_hash[:5] 
     557        return key 
     558 
    549559    ## 
    550560    # Decrypt file. 
    551561    def decrypt(self, password): 
     562        user_password = self._authenticateUserPassword(password) 
     563        if user_password: 
     564            print "User password accepted" 
     565        else: 
     566            key = self._alg33_1(password) 
     567            # rev 2 only 
     568            encrypt = self.safeGetObject(self.trailer['/Encrypt']) 
     569            real_O = self.safeGetObject(encrypt["/O"]) 
     570            userpass = utils.RC4_encrypt(key, real_O) 
     571            owner_password = self._authenticateUserPassword(userpass) 
     572            if owner_password: 
     573                print "Owner password accepted" 
     574            else: 
     575                print "Password auth failed." 
     576 
     577    def _authenticateUserPassword(self, password): 
     578        encrypt = self.safeGetObject(self.trailer['/Encrypt']) 
     579        real_U = self.safeGetObject(encrypt['/U']) 
    552580        U = self._alg34(password) 
    553         print "calc U: %r" %
    554         print "file U: %r" % self.safeGetObject(self.trailer['/Encrypt'])['/U'] 
     581        return U == real_
     582 
    555583 
    556584def getRectangle(self, name, defaults):