Style fix: always have an explicit return.

pull/1/head
Yusuke Shinyama 2014-07-15 21:38:29 +09:00
parent f5b5e31921
commit b0e035c24f
1 changed files with 16 additions and 1 deletions

View File

@ -284,7 +284,8 @@ class PDFXRefStream(PDFBaseXRef):
## ##
class PDFStandardSecurityHandler(object): class PDFStandardSecurityHandler(object):
PASSWORD_PADDING = b'(\xbfN^Nu\x8aAd\x00NV\xff\xfa\x01\x08..\x00\xb6\xd0h>\x80/\x0c\xa9\xfedSiz' PASSWORD_PADDING = (b'(\xbfN^Nu\x8aAd\x00NV\xff\xfa\x01\x08'
b'..\x00\xb6\xd0h>\x80/\x0c\xa9\xfedSiz')
supported_revisions = (2, 3) supported_revisions = (2, 3)
def __init__(self, docid, param, password=b''): def __init__(self, docid, param, password=b''):
@ -292,12 +293,14 @@ class PDFStandardSecurityHandler(object):
self.param = param self.param = param
self.password = password self.password = password
self.init() self.init()
return
def init(self): def init(self):
self.init_params() self.init_params()
if self.r not in self.supported_revisions: if self.r not in self.supported_revisions:
raise PDFEncryptionError('Unsupported revision: param=%r' % self.param) raise PDFEncryptionError('Unsupported revision: param=%r' % self.param)
self.init_key() self.init_key()
return
def init_params(self): def init_params(self):
self.v = int_value(self.param.get('V', 0)) self.v = int_value(self.param.get('V', 0))
@ -306,11 +309,13 @@ class PDFStandardSecurityHandler(object):
self.o = str_value(self.param['O']) self.o = str_value(self.param['O'])
self.u = str_value(self.param['U']) self.u = str_value(self.param['U'])
self.length = int_value(self.param.get('Length', 40)) self.length = int_value(self.param.get('Length', 40))
return
def init_key(self): def init_key(self):
self.key = self.authenticate(self.password) self.key = self.authenticate(self.password)
if self.key is None: if self.key is None:
raise PDFPasswordIncorrect raise PDFPasswordIncorrect
return
def is_printable(self): def is_printable(self):
return bool(self.p & 4) return bool(self.p & 4)
@ -364,6 +369,8 @@ class PDFStandardSecurityHandler(object):
key = self.compute_encryption_key(password) key = self.compute_encryption_key(password)
if self.verify_encryption_key(key): if self.verify_encryption_key(key):
return key return key
else:
return None
def verify_encryption_key(self, key): def verify_encryption_key(self, key):
# Algorithm 3.6 # Algorithm 3.6
@ -424,12 +431,15 @@ class PDFStandardSecurityHandlerV4(PDFStandardSecurityHandler):
self.cfm['Identity'] = self.decrypt_identity self.cfm['Identity'] = self.decrypt_identity
if self.strf not in self.cfm: if self.strf not in self.cfm:
raise PDFEncryptionError('Undefined crypt filter: param=%r' % self.param) raise PDFEncryptionError('Undefined crypt filter: param=%r' % self.param)
return
def get_cfm(self, name): def get_cfm(self, name):
if name == 'V2': if name == 'V2':
return self.decrypt_rc4 return self.decrypt_rc4
elif name == 'AESV2': elif name == 'AESV2':
return self.decrypt_aes128 return self.decrypt_aes128
else:
return None
def decrypt(self, objid, genno, data, attrs=None, name=None): def decrypt(self, objid, genno, data, attrs=None, name=None):
if not self.encrypt_metadata and attrs is not None: if not self.encrypt_metadata and attrs is not None:
@ -465,10 +475,13 @@ class PDFStandardSecurityHandlerV5(PDFStandardSecurityHandlerV4):
self.u_hash = self.u[:32] self.u_hash = self.u[:32]
self.u_validation_salt = self.u[32:40] self.u_validation_salt = self.u[32:40]
self.u_key_salt = self.u[40:] self.u_key_salt = self.u[40:]
return
def get_cfm(self, name): def get_cfm(self, name):
if name == 'AESV3': if name == 'AESV3':
return self.decrypt_aes256 return self.decrypt_aes256
else:
return None
def authenticate(self, password): def authenticate(self, password):
password = password.encode('utf-8')[:127] password = password.encode('utf-8')[:127]
@ -486,6 +499,7 @@ class PDFStandardSecurityHandlerV5(PDFStandardSecurityHandlerV4):
hash = SHA256.new(password) hash = SHA256.new(password)
hash.update(self.u_key_salt) hash.update(self.u_key_salt)
return AES.new(hash.digest(), mode=AES.MODE_CBC, IV=b'\x00' * 16).decrypt(self.ue) return AES.new(hash.digest(), mode=AES.MODE_CBC, IV=b'\x00' * 16).decrypt(self.ue)
return None
def decrypt_aes256(self, objid, genno, data): def decrypt_aes256(self, objid, genno, data):
return AES.new(self.key, mode=AES.MODE_CBC, IV=data[:16]).decrypt(data[16:]) return AES.new(self.key, mode=AES.MODE_CBC, IV=data[:16]).decrypt(data[16:])
@ -515,6 +529,7 @@ class PDFDocument(object):
security_handler_registry[4] = PDFStandardSecurityHandlerV4 security_handler_registry[4] = PDFStandardSecurityHandlerV4
if SHA256 is not None: if SHA256 is not None:
security_handler_registry[5] = PDFStandardSecurityHandlerV5 security_handler_registry[5] = PDFStandardSecurityHandlerV5
debug = 0 debug = 0
def __init__(self, parser, password=b'', caching=True, fallback=True): def __init__(self, parser, password=b'', caching=True, fallback=True):