Source code for yael.encryption
#!/usr/bin/env python
# coding=utf-8
"""
The `META-INF/encryption.xml` file, holding
information about encrypted/obfuscated assets.
"""
from yael.jsonable import JSONAble
from yael.element import Element
from yael.encdata import EncData
from yael.enckey import EncKey
from yael.namespace import Namespace
import yael.util
__author__ = "Alberto Pettarin"
__copyright__ = "Copyright 2015, Alberto Pettarin (www.albertopettarin.it)"
__license__ = "MIT"
__version__ = "0.0.6"
__email__ = "alberto@albertopettarin.it"
__status__ = "Development"
[docs]class Encryption(Element):
"""
Build the `META-INF/encryption.xml` file or
parse it from `obj` or `string`.
"""
E_ENCRYPTEDDATA = "EncryptedData"
E_ENCRYPTEDKEY = "EncryptedKey"
E_ENCRYPTION = "encryption"
def __init__(self, internal_path=None, obj=None, string=None):
self.encrypted_datas = []
self.encrypted_keys = []
Element.__init__(
self,
internal_path=internal_path,
obj=obj,
string=string)
def json_object(self, recursive=True):
obj = {
"encrypted_datas": len(self.encrypted_datas),
"encrypted_keys": len(self.encrypted_keys),
}
if recursive:
obj["encrypted_datas"] = JSONAble.safe(self.encrypted_datas)
obj["encrypted_keys"] = JSONAble.safe(self.encrypted_keys)
return obj
def parse_object(self, obj):
try:
# locate `<encryption>` element
encryption_arr = yael.util.query_xpath(
obj=obj,
query="/{0}:{1}",
args=['c', Encryption.E_ENCRYPTION],
nsp={'c': Namespace.CONTAINER},
required=Encryption.E_ENCRYPTION)
encryption = encryption_arr[0]
# locate `<enc:EncryptedKey>` elements
enc_key_arr = yael.util.query_xpath(
obj=encryption,
query="{0}:{1}",
args=['e', Encryption.E_ENCRYPTEDKEY],
nsp={'e': Namespace.ENC},
required=None)
for enc_key in enc_key_arr:
enc_key_parsed = None
try:
enc_key_parsed = EncKey(obj=enc_key)
self.encrypted_keys.append(enc_key_parsed)
except:
pass
# locate `<enc:EncryptedData>` elements
enc_data_arr = yael.util.query_xpath(
obj=encryption,
query="{0}:{1}",
args=['e', Encryption.E_ENCRYPTEDDATA],
nsp={'e': Namespace.ENC},
required=None)
for enc_data in enc_data_arr:
enc_data_parsed = None
try:
enc_data_parsed = EncData(obj=enc_data)
self.add_enc_data(enc_data_parsed)
except:
pass
except:
raise Exception("Error while parsing the given object")
[docs] def add_enc_data(self, enc_data):
"""
Add the given `<enc:EncryptedData>`.
:param item: the `<enc:EncryptedData>` to be added
:type item: :class:`yael.encdata.EncData`
"""
self.encrypted_datas.append(enc_data)
[docs] def add_enc_key(self, enc_key):
"""
Add the given `<enc:EncryptedKey>`.
:param item: the `<enc:EncryptedKey>` to be added
:type item: :class:`yael.enckey.EncKey`
"""
self.encrypted_keys.append(enc_key)
@property
def encrypted_datas(self):
"""
The `<enc:EncryptedData>` children.
:rtype: list of :class:`yael.encdata.EncData`
"""
return self.__encrypted_datas
@encrypted_datas.setter
def encrypted_datas(self, encrypted_datas):
self.__encrypted_datas = encrypted_datas
@property
def encrypted_keys(self):
"""
The `<enc:EncryptedKey>` children.
:rtype: list of :class:`yael.enckey.EncKey`
"""
return self.__encrypted_keys
@encrypted_keys.setter
def encrypted_keys(self, encrypted_keys):
self.__encrypted_keys = encrypted_keys
@property
def adobe_obfuscated_assets(self):
"""
The list of internal paths of assets
obfuscated with the Adobe algorithm.
:rtype: list of str
"""
return list(e.v_cipher_reference_uri for e in self.encrypted_datas if (
(e.v_encryption_method_algorithm == (
EncData.V_ENCRYPTIONMETHOD_ADOBE)) and
(e.v_cipher_reference_uri != None)))
@property
def idpf_obfuscated_assets(self):
"""
The list of internal paths of assets
obfuscated with the IDPF algorithm.
:rtype: list of str
"""
return list(e.v_cipher_reference_uri for e in self.encrypted_datas if (
(e.v_encryption_method_algorithm == (
EncData.V_ENCRYPTIONMETHOD_IDPF)) and
(e.v_cipher_reference_uri != None)))