@ -993,6 +993,7 @@ class DrmIon(object):
elif self . ion . gettypename ( ) in [ " com.amazon.drm.EncryptedPage@1.0 " , " com.amazon.drm.EncryptedPage@2.0 " ] :
decompress = False
decrypt = True
ct = None
civ = None
self . ion . stepin ( )
@ -1006,7 +1007,23 @@ class DrmIon(object):
civ = self . ion . lobvalue ( )
if ct is not None and civ is not None :
self . processpage ( ct , civ , outpages , decompress )
self . processpage ( ct , civ , outpages , decompress , decrypt )
self . ion . stepout ( )
elif self . ion . gettypename ( ) in [ " com.amazon.drm.PlainText@1.0 " , " com.amazon.drm.PlainText@2.0 " ] :
decompress = False
decrypt = False
plaintext = None
self . ion . stepin ( )
while self . ion . hasnext ( ) :
self . ion . next ( )
if self . ion . gettypename ( ) == " com.amazon.drm.Compressed@1.0 " :
decompress = True
if self . ion . getfieldname ( ) == " data " :
plaintext = self . ion . lobvalue ( )
if plaintext is not None :
self . processpage ( plaintext , None , outpages , decompress , decrypt )
self . ion . stepout ( )
self . ion . stepout ( )
@ -1017,9 +1034,12 @@ class DrmIon(object):
def print_ ( self , lst ) :
self . ion . print_ ( lst )
def processpage ( self , ct , civ , outpages , decompress ) :
def processpage ( self , ct , civ , outpages , decompress , decrypt ) :
if decrypt :
aes = AES . new ( self . key [ : 16 ] , AES . MODE_CBC , civ [ : 16 ] )
msg = pkcs7unpad ( aes . decrypt ( ct ) , 16 )
else :
msg = ct
if not decompress :
outpages . write ( msg )