Skip to content

Commit 1476b0d

Browse files
committed
Merge pull request #27 from sergio-garcia/master
Added missing function to include X509 data to KeyInfo
2 parents 466b991 + e349ec8 commit 1476b0d

File tree

5 files changed

+220
-0
lines changed

5 files changed

+220
-0
lines changed

src/xmlsec/template.pxd

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,20 @@ cdef extern from "xmlsec.h": # xmlsec/templates.h
2424

2525
xmlNode* xmlSecTmplKeyInfoAddX509Data(xmlNode* node) nogil
2626

27+
xmlNode* xmlSecTmplX509DataAddIssuerSerial(xmlNode* node) nogil
28+
29+
xmlNode* xmlSecTmplX509IssuerSerialAddIssuerName(xmlNode* node, const_xmlChar* name) nogil
30+
31+
xmlNode* xmlSecTmplX509IssuerSerialAddSerialNumber(xmlNode* node, const_xmlChar* serial) nogil
32+
33+
xmlNode* xmlSecTmplX509DataAddSubjectName(xmlNode* node) nogil
34+
35+
xmlNode* xmlSecTmplX509DataAddSKI(xmlNode* node) nogil
36+
37+
xmlNode* xmlSecTmplX509DataAddCertificate(xmlNode* node) nogil
38+
39+
xmlNode* xmlSecTmplX509DataAddCRL(xmlNode* node) nogil
40+
2741
xmlNode* xmlSecTmplKeyInfoAddEncryptedKey(
2842
xmlNode* keyInfoNode, xmlSecTransformId encMethodId,
2943
const_xmlChar *id, const_xmlChar *type, const_xmlChar *recipient) nogil

src/xmlsec/template.pyx

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,71 @@ def add_x509_data(_Element node not None):
8989
return elementFactory(node._doc, c_node)
9090

9191

92+
def x509_data_add_issuer_serial(_Element node not None):
93+
94+
cdef xmlNode* c_node
95+
96+
c_node = xmlSecTmplX509DataAddIssuerSerial(node._c_node)
97+
98+
return elementFactory(node._doc, c_node)
99+
100+
101+
def x509_issuer_serial_add_issuer_name(_Element node not None, name=None):
102+
103+
cdef xmlNode* c_node
104+
cdef const_xmlChar* c_name = _b(name)
105+
106+
c_node = xmlSecTmplX509IssuerSerialAddIssuerName(node._c_node, c_name)
107+
108+
return elementFactory(node._doc, c_node)
109+
110+
111+
def x509_issuer_serial_add_serial_number(_Element node not None, serial=None):
112+
113+
cdef xmlNode* c_node
114+
cdef const_xmlChar* c_serial = _b(serial)
115+
116+
c_node = xmlSecTmplX509IssuerSerialAddSerialNumber(node._c_node, c_serial)
117+
118+
return elementFactory(node._doc, c_node)
119+
120+
121+
def x509_data_add_subject_name(_Element node not None):
122+
123+
cdef xmlNode* c_node
124+
125+
c_node = xmlSecTmplX509DataAddSubjectName(node._c_node)
126+
127+
return elementFactory(node._doc, c_node)
128+
129+
130+
def x509_data_add_ski(_Element node not None):
131+
132+
cdef xmlNode* c_node
133+
134+
c_node = xmlSecTmplX509DataAddSKI(node._c_node)
135+
136+
return elementFactory(node._doc, c_node)
137+
138+
139+
def x509_data_add_certificate(_Element node not None):
140+
141+
cdef xmlNode* c_node
142+
143+
c_node = xmlSecTmplX509DataAddCertificate(node._c_node)
144+
145+
return elementFactory(node._doc, c_node)
146+
147+
148+
def x509_data_add_crl(_Element node not None):
149+
150+
cdef xmlNode* c_node
151+
152+
c_node = xmlSecTmplX509DataAddCRL(node._c_node)
153+
154+
return elementFactory(node._doc, c_node)
155+
156+
92157
def add_encrypted_key(_Element node not None,
93158
_Transform method not None,
94159
id=None,

tests/examples/sign5-doc.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
XML Security Library example: Original XML doc file for sign5 example.
4+
-->
5+
<Envelope xmlns="urn:envelope">
6+
<Data>
7+
Hello, World!
8+
</Data>
9+
</Envelope>

tests/examples/sign5-res.xml

Lines changed: 67 additions & 0 deletions
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>[email protected],CN=Aleksey Sanin,OU=Examples RSA Certificate,O=XML Security Library (http://www.aleksey.com/xmlsec),ST=California,C=US</X509SubjectName>
64+
<X509SKI>JIQs8tRZIGKLLlyGkKOqMLonGpw=</X509SKI>
65+
</X509Data>
66+
</KeyInfo>
67+
</Signature></Envelope>

tests/examples/test_sign.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,71 @@ def test_sign_generated_template_pem_with_x509_with_custom_ns():
222222
compare('sign4-res.xml', template)
223223

224224

225+
def test_sign_generated_template_pem_with_x509_with_cert_info():
226+
"""
227+
Should sign a file using a dynamicaly created template, key from PEM
228+
file and an X509 certificate.
229+
"""
230+
231+
# Load document file.
232+
template = parse_xml('sign5-doc.xml')
233+
234+
# Create a signature template for RSA-SHA1 enveloped signature.
235+
signature_node = xmlsec.template.create(
236+
template,
237+
xmlsec.Transform.EXCL_C14N,
238+
xmlsec.Transform.RSA_SHA1)
239+
240+
assert signature_node is not None
241+
242+
# Add the <ds:Signature/> node to the document.
243+
template.append(signature_node)
244+
245+
# Add the <ds:Reference/> node to the signature template.
246+
ref = xmlsec.template.add_reference(signature_node, xmlsec.Transform.SHA1)
247+
248+
# Add the enveloped transform descriptor.
249+
xmlsec.template.add_transform(ref, xmlsec.Transform.ENVELOPED)
250+
251+
# Add the <ds:KeyInfo/> and <ds:KeyName/> nodes.
252+
key_info = xmlsec.template.ensure_key_info(signature_node)
253+
x509_data = xmlsec.template.add_x509_data(key_info)
254+
xmlsec.template.x509_data_add_subject_name(x509_data)
255+
xmlsec.template.x509_data_add_certificate(x509_data)
256+
xmlsec.template.x509_data_add_ski(x509_data)
257+
x509_issuer_serial = xmlsec.template.x509_data_add_issuer_serial(x509_data)
258+
xmlsec.template.x509_issuer_serial_add_issuer_name(x509_issuer_serial, 'Test Issuer')
259+
xmlsec.template.x509_issuer_serial_add_serial_number(x509_issuer_serial, '1')
260+
261+
# Create a digital signature context (no key manager is needed).
262+
ctx = xmlsec.SignatureContext()
263+
264+
# Load private key (assuming that there is no password).
265+
filename = path.join(BASE_DIR, 'rsakey.pem')
266+
key = xmlsec.Key.from_file(filename, xmlsec.KeyFormat.PEM)
267+
268+
assert key is not None
269+
270+
# Load the certificate and add it to the key.
271+
filename = path.join(BASE_DIR, 'rsacert.pem')
272+
key.load_cert_from_file(filename, xmlsec.KeyFormat.PEM)
273+
274+
# Set key name to the file name (note: this is just a test).
275+
key.name = path.basename(filename)
276+
277+
# Set the key on the context.
278+
ctx.key = key
279+
280+
assert ctx.key is not None
281+
assert ctx.key.name == path.basename(filename)
282+
283+
# Sign the template.
284+
ctx.sign(signature_node)
285+
286+
# Assert the contents of the XML document against the expected result.
287+
compare('sign5-res.xml', template)
288+
289+
225290
def test_sign_binary():
226291
ctx = xmlsec.SignatureContext()
227292
filename = path.join(BASE_DIR, 'rsakey.pem')

0 commit comments

Comments
 (0)