@@ -185,6 +185,47 @@ static PyObject* PyXmlSec_KeyFromFile(PyObject* self, PyObject* args, PyObject*
185185 return NULL ;
186186}
187187
188+ static const char PyXmlSec_KeyFromEngine__doc__ [] = \
189+ "from_engine(engine_and_key_id) -> xmlsec.Key\n"
190+ "Loads PKI key from an engine.\n\n"
191+ ":param engine_and_key_id: engine and key id, i.e. 'pkcs11;pkcs11:token=XmlsecToken;object=XmlsecKey;pin-value=password'\n"
192+ ":type engine_and_key_id: :class:`str`, "
193+ ":return: pointer to newly created key\n"
194+ ":rtype: :class:`~xmlsec.Key`" ;
195+ static PyObject * PyXmlSec_KeyFromEngine (PyObject * self , PyObject * args , PyObject * kwargs ) {
196+ static char * kwlist [] = {"engine_and_key_id" , NULL };
197+
198+ const char * engine_and_key_id = NULL ;
199+ PyXmlSec_Key * key = NULL ;
200+
201+ PYXMLSEC_DEBUG ("load key from engine - start" );
202+ if (!PyArg_ParseTupleAndKeywords (args , kwargs , "s:from_engine" , kwlist , & engine_and_key_id )) {
203+ goto ON_FAIL ;
204+ }
205+
206+ if ((key = PyXmlSec_NewKey1 ((PyTypeObject * )self )) == NULL ) goto ON_FAIL ;
207+
208+ Py_BEGIN_ALLOW_THREADS ;
209+ key -> handle = xmlSecCryptoAppKeyLoad (engine_and_key_id , xmlSecKeyDataFormatEngine , NULL , xmlSecCryptoAppGetDefaultPwdCallback (),
210+ (void * )engine_and_key_id );
211+ Py_END_ALLOW_THREADS ;
212+
213+ if (key -> handle == NULL ) {
214+ PyXmlSec_SetLastError ("cannot read key" );
215+ goto ON_FAIL ;
216+ }
217+
218+ key -> is_own = 1 ;
219+
220+ PYXMLSEC_DEBUG ("load key from engine - ok" );
221+ return (PyObject * )key ;
222+
223+ ON_FAIL :
224+ PYXMLSEC_DEBUG ("load key from engine - fail" );
225+ Py_XDECREF (key );
226+ return NULL ;
227+ }
228+
188229static const char PyXmlSec_KeyGenerate__doc__ [] = \
189230 "generate(klass, size, type) -> xmlsec.Key\n"
190231 "Generates key of kind ``klass`` with ``size`` and ``type``.\n\n"
@@ -494,6 +535,12 @@ static PyMethodDef PyXmlSec_KeyMethods[] = {
494535 METH_CLASS |METH_VARARGS |METH_KEYWORDS ,
495536 PyXmlSec_KeyFromFile__doc__
496537 },
538+ {
539+ "from_engine" ,
540+ (PyCFunction )PyXmlSec_KeyFromEngine ,
541+ METH_CLASS |METH_VARARGS |METH_KEYWORDS ,
542+ PyXmlSec_KeyFromEngine__doc__
543+ },
497544 {
498545 "generate" ,
499546 (PyCFunction )PyXmlSec_KeyGenerate ,
0 commit comments