Viewing file: Engine.py (3.32 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
# vim: sts=4 sw=4 et """ M2Crypto wrapper for OpenSSL ENGINE API.
Pavel Shramov IMEC MSU """
from M2Crypto import m2, EVP, X509, Err
class EngineError(Exception): pass
m2.engine_init(EngineError)
class Engine: """Wrapper for ENGINE object."""
m2_engine_free = m2.engine_free def __init__(self, id = None, _ptr = None, _pyfree = 1): """Create new Engine from ENGINE pointer or obtain by id""" if not _ptr and not id: raise ValueError("No engine id specified") self._ptr = _ptr if not self._ptr: self._ptr = m2.engine_by_id(id) if not self._ptr: raise ValueError("Unknown engine: %s" % id) self._pyfree = _pyfree
def __del__(self): if getattr(self, '_pyfree', 0): self.m2_engine_free(self._ptr)
def ctrl_cmd_string(self, cmd, arg, optional = 0): """Call ENGINE_ctrl_cmd_string""" if not m2.engine_ctrl_cmd_string(self._ptr, cmd, arg, optional): raise EngineError(Err.get_error())
def get_name(self): """Return engine name""" return m2.engine_get_name(self._ptr)
def get_id(self): """Return engine id""" return m2.engine_get_id(self._ptr)
def set_default(self, methods = m2.ENGINE_METHOD_ALL): """Use this engine as default for methods specified in argument Possible values are bitwise OR of m2.ENGINE_METHOD_*""" return m2.engine_set_default(self._ptr, methods)
def _engine_load_key(self, func, name, pin = None): """Helper function for loading keys""" ui = m2.ui_openssl() cbd = m2.engine_pkcs11_data_new(pin) try: kptr = func(self._ptr, name, ui, cbd) if not kptr: raise EngineError(Err.get_error()) key = EVP.PKey(kptr, _pyfree = 1) finally: m2.engine_pkcs11_data_free(cbd) return key
def load_private_key(self, name, pin = None): """Load private key with engine methods (e.g from smartcard). If pin is not set it will be asked """ return self._engine_load_key(m2.engine_load_private_key, name, pin)
def load_public_key(self, name, pin = None): """Load public key with engine methods (e.g from smartcard).""" return self._engine_load_key(m2.engine_load_public_key, name, pin)
def load_certificate(self, name): """Load certificate from engine (e.g from smartcard). NOTE: This function may be not implemented by engine!""" cptr = m2.engine_load_certificate(self._ptr, name) if not cptr: raise EngineError("Certificate or card not found") return X509.X509(cptr, _pyfree = 1)
def load_dynamic_engine(id, sopath): """Load and return dymanic engine from sopath and assign id to it""" m2.engine_load_dynamic() e = Engine('dynamic') e.ctrl_cmd_string("SO_PATH", sopath) e.ctrl_cmd_string("ID", id) e.ctrl_cmd_string("LIST_ADD", "1") e.ctrl_cmd_string("LOAD", None) return e
def load_dynamic(): """Load dynamic engine""" m2.engine_load_dynamic()
def load_openssl(): """Load openssl engine""" m2.engine_load_openssl()
def cleanup(): """If you load any engines, you need to clean up after your application is finished with the engines.""" m2.engine_cleanup()
|