Skip to content

Commit 99e5cb2

Browse files
authored
Merge pull request #253 from tdivis/164-pkcs11-support
164 pkcs11 support
2 parents a4e135a + 6c90fe7 commit 99e5cb2

File tree

9 files changed

+532
-4
lines changed

9 files changed

+532
-4
lines changed

Diff for: .github/workflows/sdist.yml

+1-2
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,8 @@ jobs:
1616
run: |
1717
python setup.py sdist
1818
- name: Install test dependencies
19-
env:
20-
PYXMLSEC_STATIC_DEPS: true
2119
run: |
20+
sudo apt-get install libxml2-dev libxmlsec1-dev libxmlsec1-openssl opensc softhsm2 libengine-pkcs11-openssl
2221
pip install --upgrade -r requirements-test.txt
2322
pip install black # for stub generation tests
2423
pip install dist/xmlsec-$(python setup.py --version).tar.gz

Diff for: README.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ Check the `examples <https://xmlsec.readthedocs.io/en/latest/examples.html>`_ se
3737
Requirements
3838
************
3939
- ``libxml2 >= 2.9.1``
40-
- ``libxmlsec1 >= 1.2.18``
40+
- ``libxmlsec1 >= 1.2.33``
4141

4242
Install
4343
*******

Diff for: src/keys.c

+47
Original file line numberDiff line numberDiff line change
@@ -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+
188229
static 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,

Diff for: src/main.c

+13
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,13 @@ static PyObject* PyXmlSec_PyShutdown(PyObject* self) {
119119
Py_RETURN_NONE;
120120
}
121121

122+
static char PyXmlSec_GetLibXmlSecVersion__doc__[] = \
123+
"get_libxmlsec_version() -> tuple\n"
124+
"Returns Version tuple of wrapped libxml library.";
125+
static PyObject* PyXmlSec_GetLibXmlSecVersion() {
126+
return Py_BuildValue("(iii)", XMLSEC_VERSION_MAJOR, XMLSEC_VERSION_MINOR, XMLSEC_VERSION_SUBMINOR);
127+
}
128+
122129
static char PyXmlSec_PyEnableDebugOutput__doc__[] = \
123130
"enable_debug_trace(enabled) -> None\n"
124131
"Enables or disables calling LibXML2 callback from the default errors callback.\n\n"
@@ -386,6 +393,12 @@ static PyMethodDef PyXmlSec_MainMethods[] = {
386393
METH_NOARGS,
387394
PyXmlSec_PyShutdown__doc__
388395
},
396+
{
397+
"get_libxmlsec_version",
398+
(PyCFunction)PyXmlSec_GetLibXmlSecVersion,
399+
METH_NOARGS,
400+
PyXmlSec_GetLibXmlSecVersion__doc__
401+
},
389402
{
390403
"enable_debug_trace",
391404
(PyCFunction)PyXmlSec_PyEnableDebugOutput,

Diff for: src/xmlsec/__init__.pyi

+2
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ class Key:
4949
@classmethod
5050
def from_file(cls: type[Self], file: GenericPath[AnyStr] | IO[AnyStr], format: int, password: str | None = ...) -> Self: ...
5151
@classmethod
52+
def from_engine(cls: type[Self], engine_and_key_id: AnyStr) -> Self: ...
53+
@classmethod
5254
def from_memory(cls: type[Self], data: AnyStr, format: int, password: str | None = ...) -> Self: ...
5355
@classmethod
5456
def generate(cls: type[Self], klass: KeyData, size: int, type: int) -> Self: ...

Diff for: tests/data/sign5-out-xmlsec_1_2_36_to_37.xml

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
XML Security Library example: Signed XML doc file (sign5 example).
4+
-->
5+
<Envelope xmlns="urn:envelope">
6+
<Data>
7+
Hello, World!
8+
</Data>
9+
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
10+
<SignedInfo>
11+
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
12+
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
13+
<Reference>
14+
<Transforms>
15+
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
16+
</Transforms>
17+
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
18+
<DigestValue>HjY8ilZAIEM2tBbPn5mYO1ieIX4=</DigestValue>
19+
</Reference>
20+
</SignedInfo>
21+
<SignatureValue>SIaj/6KY3C1SmDXU2++Gm31U1xTadFp04WhBgfsJFbxrL+q7GKSKN9kfQ+UpN9+i
22+
D5fWmuavXEHe4Gw6RMaMEkq2URQo7F68+d5J/ajq8/l4n+xE6/reGScVwT6L4dEP
23+
XXVJcAi2ZnQ3O7GTNvNGCPibL9mUcyCWBFZ92Uemtc/vJFCQ7ZyKMdMfACgxOwyN
24+
T/9971oog241/2doudhonc0I/3mgPYWkZdX6yvr62mEjnG+oUZkhWYJ4ewZJ4hM4
25+
JjbFqZO+OEzDRSbw3DkmuBA/mtlx+3t13SESfEub5hqoMdVmtth/eTb64dsPdl9r
26+
3k1ACVX9f8aHfQQdJOmLFQ==</SignatureValue>
27+
<KeyInfo>
28+
<X509Data>
29+
30+
31+
32+
<X509IssuerSerial>
33+
<X509IssuerName>Test Issuer</X509IssuerName>
34+
<X509SerialNumber>1</X509SerialNumber>
35+
</X509IssuerSerial>
36+
<X509Certificate>MIIE3zCCBEigAwIBAgIBBTANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCVVMx
37+
EzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVN1bm55dmFsZTE9MDsGA1UE
38+
ChM0WE1MIFNlY3VyaXR5IExpYnJhcnkgKGh0dHA6Ly93d3cuYWxla3NleS5jb20v
39+
eG1sc2VjKTEZMBcGA1UECxMQUm9vdCBDZXJ0aWZpY2F0ZTEWMBQGA1UEAxMNQWxl
40+
a3NleSBTYW5pbjEhMB8GCSqGSIb3DQEJARYSeG1sc2VjQGFsZWtzZXkuY29tMB4X
41+
DTAzMDMzMTA0MDIyMloXDTEzMDMyODA0MDIyMlowgb8xCzAJBgNVBAYTAlVTMRMw
42+
EQYDVQQIEwpDYWxpZm9ybmlhMT0wOwYDVQQKEzRYTUwgU2VjdXJpdHkgTGlicmFy
43+
eSAoaHR0cDovL3d3dy5hbGVrc2V5LmNvbS94bWxzZWMpMSEwHwYDVQQLExhFeGFt
44+
cGxlcyBSU0EgQ2VydGlmaWNhdGUxFjAUBgNVBAMTDUFsZWtzZXkgU2FuaW4xITAf
45+
BgkqhkiG9w0BCQEWEnhtbHNlY0BhbGVrc2V5LmNvbTCCASIwDQYJKoZIhvcNAQEB
46+
BQADggEPADCCAQoCggEBAJe4/rQ/gzV4FokE7CthjL/EXwCBSkXm2c3p4jyXO0Wt
47+
quaNC3dxBwFPfPl94hmq3ZFZ9PHPPbp4RpYRnLZbRjlzVSOq954AXOXpSew7nD+E
48+
mTqQrd9+ZIbGJnLOMQh5fhMVuOW/1lYCjWAhTCcYZPv7VXD2M70vVXDVXn6ZrqTg
49+
qkVHE6gw1aCKncwg7OSOUclUxX8+Zi10v6N6+PPslFc5tKwAdWJhVLTQ4FKG+F53
50+
7FBDnNK6p4xiWryy/vPMYn4jYGvHUUk3eH4lFTCr+rSuJY8i/KNIf/IKim7g/o3w
51+
Ae3GM8xrof2mgO8GjK/2QDqOQhQgYRIf4/wFsQXVZcMCAwEAAaOCAVcwggFTMAkG
52+
A1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRp
53+
ZmljYXRlMB0GA1UdDgQWBBQkhCzy1FkgYosuXIaQo6owuicanDCB+AYDVR0jBIHw
54+
MIHtgBS0ue+a5pcOaGUemM76VQ2JBttMfKGB0aSBzjCByzELMAkGA1UEBhMCVVMx
55+
EzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVN1bm55dmFsZTE9MDsGA1UE
56+
ChM0WE1MIFNlY3VyaXR5IExpYnJhcnkgKGh0dHA6Ly93d3cuYWxla3NleS5jb20v
57+
eG1sc2VjKTEZMBcGA1UECxMQUm9vdCBDZXJ0aWZpY2F0ZTEWMBQGA1UEAxMNQWxl
58+
a3NleSBTYW5pbjEhMB8GCSqGSIb3DQEJARYSeG1sc2VjQGFsZWtzZXkuY29tggEA
59+
MA0GCSqGSIb3DQEBBAUAA4GBALU/mzIxSv8vhDuomxFcplzwdlLZbvSQrfoNkMGY
60+
1UoS3YJrN+jZLWKSyWE3mIaPpElqXiXQGGkwD5iPQ1iJMbI7BeLvx6ZxX/f+c8Wn
61+
ss0uc1NxfahMaBoyG15IL4+beqO182fosaKJTrJNG3mc//ANGU9OsQM9mfBEt4oL
62+
NJ2D</X509Certificate>
63+
<X509SubjectName/>
64+
<X509SKI/>
65+
</X509Data>
66+
</KeyInfo>
67+
</Signature></Envelope>

0 commit comments

Comments
 (0)