Skip to content

Commit dcf2fd9

Browse files
committed
Merge pull request xmlsec#2 from bgaifullin/master
support encryption, transformation
2 parents 4f82a9b + 129c796 commit dcf2fd9

27 files changed

Lines changed: 1228 additions & 200 deletions

setup.cfg

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
1-
[pytest]
2-
addopts = tests -s -rx
1+
[bdist_rpm]
2+
release = 1
3+
build-requires = pkgconfig xmlsec1-devel libxml2-devel xmlsec1-openssl-devel
4+
group = Development/Libraries
5+
requires = xmlsec1 xmlsec1-openssl

setup.py

Lines changed: 21 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -12,75 +12,45 @@ def lazy(function):
1212
@wraps(function)
1313
def wrapped(*args, **kwargs):
1414

15-
class LazyProxy(object):
15+
class LazyProxy(Extension):
16+
__arguments = dict()
1617

1718
def __init__(self, function, args, kwargs):
18-
self._function = function
19-
self._args = args
20-
self._kwargs = kwargs
21-
self._result = None
19+
self.__arguments["function"] = function
20+
self.__arguments["args"] = args
21+
self.__arguments["kwargs"] = kwargs
22+
self.__arguments["result"] = None
2223

23-
def __getattribute__(self, name):
24-
if name in ['_function', '_args', '_kwargs', '_result']:
25-
return super(LazyProxy, self).__getattribute__(name)
24+
def __getattr__(self, item):
25+
if self.__arguments["result"] is None:
26+
self.__arguments["result"] = self.__arguments["function"](*self.__arguments["args"],
27+
**self.__arguments["kwargs"])
2628

27-
if self._result is None:
28-
self._result = self._function(*self._args, **self._kwargs)
29-
30-
return object.__getattribute__(self._result, name)
29+
return getattr(self.__arguments["result"], item)
3130

3231
def __setattr__(self, name, value):
33-
if name in ['_function', '_args', '_kwargs', '_result']:
34-
super(LazyProxy, self).__setattr__(name, value)
35-
return
36-
37-
if self._result is None:
38-
self._result = self._function(*self._args, **self._kwargs)
32+
if self.__arguments["result"] is None:
33+
self.__arguments["result"] = self.__arguments["function"](*self.__arguments["args"],
34+
**self.__arguments["kwargs"])
3935

40-
setattr(self._result, name, value)
36+
setattr(self.__arguments["result"], name, value)
4137

4238
return LazyProxy(function, args, kwargs)
4339

4440
return wrapped
4541

4642

47-
class Extension(Extension, object):
48-
49-
lxml_extended = False
50-
51-
@property
52-
def include_dirs(self):
53-
dirs = self.__dict__['include_dirs']
54-
if self.lxml_extended:
55-
return dirs
56-
57-
# Resolve lxml include directories.
58-
import lxml
59-
lxml_base = path.dirname(lxml.__file__)
60-
lxml_include = path.join(lxml_base, 'includes')
61-
62-
dirs.insert(0, lxml_include)
63-
dirs.insert(0, lxml_base)
64-
65-
self.lxml_extended = True
66-
return dirs
67-
68-
@include_dirs.setter
69-
def include_dirs(self, dirs):
70-
self.__dict__['include_dirs'] = dirs
71-
72-
7343
@lazy
7444
def make_extension(name, cython=True):
7545
from pkgconfig import parse
7646

7747
# Declare the crypto implementation.
78-
XMLSEC_CRYPTO = 'openssl'
48+
xmlsec_crypto = 'openssl'
7949

8050
# Process the `pkg-config` utility and discover include and library
8151
# directories.
8252
config = {}
83-
for lib in ['libxml-2.0', 'xmlsec1-%s' % XMLSEC_CRYPTO]:
53+
for lib in ['libxml-2.0', 'xmlsec1-%s' % xmlsec_crypto]:
8454
config.update(parse(lib))
8555

8656
config['extra_compile_args'] = ['-DXMLSEC_CRYPTO_OPENSSL=1']
@@ -93,6 +63,9 @@ def make_extension(name, cython=True):
9363
config['include_dirs'] = []
9464

9565
# Add the source directories for inclusion.
66+
import lxml
67+
config['include_dirs'].insert(0, path.dirname(lxml.__file__))
68+
config['include_dirs'].insert(0, path.join(path.dirname(lxml.__file__), 'includes'))
9669
config['include_dirs'].insert(0, 'src')
9770

9871
# Resolve extension location from name.
@@ -144,6 +117,7 @@ def make_extension(name, cython=True):
144117
make_extension('xmlsec.tree'),
145118
make_extension('xmlsec.key'),
146119
make_extension('xmlsec.ds'),
120+
make_extension('xmlsec.enc'),
147121
make_extension('xmlsec.template'),
148122
]
149123
)

src/xmlsec/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
from .utils import *
77
from .key import *
88
from .ds import *
9+
from .enc import *
10+
from .error import *
911
from . import tree, template
1012

1113

src/xmlsec/constants.pxd

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,40 @@ cdef extern from "xmlsec.h": # xmlsec/strings.h
2525
const_xmlChar* xmlSecNodeManifest
2626
const_xmlChar* xmlSecNodeSignatureProperties
2727

28+
# Encypted nodes
29+
const_xmlChar* xmlSecNodeEncryptedData
30+
const_xmlChar* xmlSecNodeEncryptedKey
31+
const_xmlChar* xmlSecNodeEncryptionMethod
32+
const_xmlChar* xmlSecNodeEncryptionProperties
33+
const_xmlChar* xmlSecNodeEncryptionProperty
34+
const_xmlChar* xmlSecNodeCipherData
35+
const_xmlChar* xmlSecNodeCipherValue
36+
const_xmlChar* xmlSecNodeCipherReference
37+
const_xmlChar* xmlSecNodeReferenceList
38+
const_xmlChar* xmlSecNodeDataReference
39+
const_xmlChar* xmlSecNodeKeyReference
40+
const_xmlChar* xmlSecNodeKeyInfo
41+
42+
43+
# encryption types
44+
const_xmlChar* xmlSecTypeEncContent
45+
const_xmlChar* xmlSecTypeEncElement
46+
47+
ctypedef unsigned int xmlSecTransformUsage
48+
cdef enum:
49+
xmlSecTransformUsageUnknown=0x0000
50+
xmlSecTransformUsageDSigTransform=0x0001
51+
xmlSecTransformUsageC14NMethod=0x0002
52+
xmlSecTransformUsageDigestMethod=0x0004
53+
xmlSecTransformUsageSignatureMethod=0x0008
54+
xmlSecTransformUsageEncryptionMethod=0x0010
55+
xmlSecTransformUsageAny=0xFFFF
56+
2857
# Transform ids
2958
cdef struct _xmlSecTransformKlass:
3059
const_xmlChar* name
3160
const_xmlChar* href
61+
xmlSecTransformUsage usage
3262

3363
ctypedef _xmlSecTransformKlass *xmlSecTransformId
3464

src/xmlsec/constants.pyx

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
# -*- coding: utf-8 -*-
22
from __future__ import absolute_import, unicode_literals, division
33

4-
from xmlsec.constants cimport *
5-
from xmlsec.utils cimport *
4+
from .constants cimport *
5+
from .utils cimport *
66

77
__all__ = [
88
'Namespace',
99
'Node',
10-
'Transform'
10+
'Transform',
11+
'EncryptionType'
1112
]
1213

1314

@@ -24,6 +25,11 @@ class Namespace:
2425
SOAP12 = _u(xmlSecSoap12Ns)
2526

2627

28+
class EncryptionType:
29+
CONTENT = _u(xmlSecTypeEncContent)
30+
ELEMENT = _u(xmlSecTypeEncElement)
31+
32+
2733
class Node:
2834
"""Digital signature nodes."""
2935
SIGNATURE = _u(xmlSecNodeSignature)
@@ -36,6 +42,32 @@ class Node:
3642
OBJECT = _u(xmlSecNodeObject)
3743
MANIFEST = _u(xmlSecNodeManifest)
3844
SIGNATURE_PROPERTIES = _u(xmlSecNodeSignatureProperties)
45+
ENCRYPTED_DATA = _u(xmlSecNodeEncryptedData)
46+
ENCRYPTED_KEY = _u(xmlSecNodeEncryptedKey)
47+
ENCRYPTION_METHOD = _u(xmlSecNodeEncryptionMethod)
48+
ENCRYPTION_PROPERTIES = _u(xmlSecNodeEncryptionProperties)
49+
ENCRYPTION_PROPERTY = _u(xmlSecNodeEncryptionProperty)
50+
CIPHER_DATA = _u(xmlSecNodeCipherData)
51+
CIPHER_VALUE = _u(xmlSecNodeCipherValue)
52+
CIPHER_REFERENCE = _u(xmlSecNodeCipherReference)
53+
REFERENCE_LIST = _u(xmlSecNodeReferenceList)
54+
DATA_REFERENCE = _u(xmlSecNodeDataReference)
55+
KEY_REFERENCE = _u(xmlSecNodeKeyReference)
56+
KEY_INFO = _u(xmlSecNodeKeyInfo)
57+
58+
59+
cdef class _Transform:
60+
property name:
61+
def __get__(self):
62+
return _u(self.target.name)
63+
64+
property href:
65+
def __get__(self):
66+
return _u(self.target.href)
67+
68+
property usage:
69+
def __get__(self):
70+
return self.target.usage
3971

4072

4173
cdef _Transform _mkti(xmlSecTransformId target):

src/xmlsec/ds.pxd

Lines changed: 75 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,66 @@
11
from lxml.includes.tree cimport xmlNode
22
from lxml.includes.tree cimport const_xmlChar, xmlNode, xmlID, xmlDoc, xmlAttr
33
from lxml.includes.dtdvalid cimport xmlValidCtxt
4-
from xmlsec.key cimport xmlSecKeyPtr
4+
from .key cimport xmlSecKeyPtr, xmlSecKeyReq, xmlSecKeyReqPtr, xmlSecKeysMngrPtr
5+
from .constants cimport xmlSecTransformId
56

67

78
cdef extern from "xmlsec.h": # xmlsec/keys.h
89

10+
ctypedef unsigned int xmlSecSize
11+
ctypedef unsigned char xmlSecByte
12+
ctypedef xmlSecByte const_xmlSecByte "const xmlSecByte"
13+
14+
ctypedef void * xmlSecPtrList
15+
ctypedef xmlSecPtrList * xmlSecPtrListPtr
16+
ctypedef void * xmlSecPtr
17+
18+
int xmlSecPtrListAdd(xmlSecPtrListPtr, xmlSecPtr) nogil
19+
20+
int xmlSecPtrListEmpty(xmlSecPtrListPtr) nogil
21+
22+
cdef struct _xmlSecBuffer:
23+
xmlSecByte* data
24+
size_t size
25+
# size_t maxSize
26+
# xmlSecAllocMode allocMode
27+
28+
ctypedef _xmlSecBuffer *xmlSecBufferPtr
29+
30+
# transforms and transform contexts (partial)
31+
ctypedef enum xmlSecTransformStatus:
32+
xmlSecTransformStatusNone = 0
33+
xmlSecTransformStatusWorking
34+
xmlSecTransformStatusFinished
35+
xmlSecTransformStatusOk
36+
xmlSecTransformStatusFail
37+
38+
ctypedef enum xmlSecTransformOperation:
39+
xmlSecTransformOperationNone = 0
40+
xmlSecTransformOperationEncode
41+
xmlSecTransformOperationDecode
42+
xmlSecTransformOperationSign
43+
xmlSecTransformOperationVerify
44+
xmlSecTransformOperationEncrypt
45+
xmlSecTransformOperationDecrypt
46+
47+
cdef struct _xmlSecTransform:
48+
xmlSecTransformOperation operation
49+
xmlSecTransformStatus status
50+
51+
ctypedef _xmlSecTransform* xmlSecTransformPtr
52+
53+
cdef struct _xmlSecTransformCtx:
54+
xmlSecBufferPtr result
55+
xmlSecTransformStatus status
56+
57+
ctypedef _xmlSecTransformCtx xmlSecTransformCtx
58+
ctypedef _xmlSecTransformCtx* xmlSecTransformCtxPtr
59+
60+
cdef struct xmlSecKeyInfoCtx:
61+
xmlSecPtrList enabledKeyData
62+
xmlSecKeyReq keyReq
63+
964
ctypedef enum xmlSecDSigStatus:
1065
xmlSecDSigStatusUnknown = 0
1166
xmlSecDSigStatusSucceeded = 1
@@ -15,20 +70,20 @@ cdef extern from "xmlsec.h": # xmlsec/keys.h
1570
# void* userData
1671
# unsigned int flags
1772
# unsigned int flags2
18-
# xmlSecKeyInfoCtx keyInfoReadCtx
73+
xmlSecKeyInfoCtx keyInfoReadCtx
1974
# xmlSecKeyInfoCtx keyInfoWriteCtx
20-
# xmlSecTransformCtx transformCtx
75+
xmlSecTransformCtx transformCtx
2176
# xmlSecTransformUriType enabledReferenceUris
2277
# xmlSecPtrListPtr enabledReferenceTransforms
2378
# xmlSecTransformCtxPreExecuteCallback referencePreExecuteCallback
2479
# xmlSecTransformId defSignMethodId
2580
# xmlSecTransformId defC14NMethodId
2681
# xmlSecTransformId defDigestMethodId
2782
xmlSecKeyPtr signKey
28-
# xmlSecTransformOperation operation
83+
xmlSecTransformOperation operation
2984
# xmlSecBufferPtr result
3085
xmlSecDSigStatus status
31-
# xmlSecTransformPtr signMethod
86+
xmlSecTransformPtr signMethod
3287
# xmlSecTransformPtr c14nMethod
3388
# xmlSecTransformPtr preSignMemBufMethod
3489
# xmlNode* signValueNode
@@ -40,7 +95,6 @@ cdef extern from "xmlsec.h": # xmlsec/keys.h
4095

4196
ctypedef _xmlSecDSigCtx* xmlSecDSigCtxPtr
4297

43-
ctypedef void* xmlSecKeysMngrPtr
4498

4599
xmlSecDSigCtxPtr xmlSecDSigCtxCreate(xmlSecKeysMngrPtr) nogil
46100

@@ -50,13 +104,22 @@ cdef extern from "xmlsec.h": # xmlsec/keys.h
50104

51105
int xmlSecDSigCtxVerify(xmlSecDSigCtxPtr, xmlNode*) nogil
52106

53-
# int xmlSecDSigCtxEnableReferenceTransform(
54-
# xmlSecDSigCtxPtr, xmlSecTransformId) nogil
107+
int xmlSecDSigCtxEnableReferenceTransform(
108+
xmlSecDSigCtxPtr, xmlSecTransformId) nogil
55109

56-
# int xmlSecDSigCtxEnableSignatureTransform(
57-
# xmlSecDSigCtxPtr, xmlSecTransformId) nogil
110+
int xmlSecDSigCtxEnableSignatureTransform(
111+
xmlSecDSigCtxPtr, xmlSecTransformId) nogil
58112

59113
void xmlSecDSigCtxDestroy(xmlSecDSigCtxPtr) nogil
60114

61-
xmlID* xmlAddID(
62-
xmlValidCtxt* ctx, xmlDoc* doc, const_xmlChar* value, xmlAttr* attr);
115+
xmlID* xmlAddID(xmlValidCtxt* ctx, xmlDoc* doc, const_xmlChar* value, xmlAttr* attr)
116+
117+
xmlSecTransformPtr xmlSecTransformCtxCreateAndAppend(xmlSecTransformCtxPtr, xmlSecTransformId) nogil
118+
119+
int xmlSecTransformSetKey(xmlSecTransformPtr, xmlSecKeyPtr) nogil
120+
121+
int xmlSecTransformSetKeyReq(xmlSecTransformPtr, xmlSecKeyReqPtr) nogil
122+
123+
int xmlSecTransformVerify(xmlSecTransformPtr, const_xmlSecByte*, xmlSecSize, xmlSecTransformCtxPtr) nogil
124+
125+
int xmlSecTransformCtxBinaryExecute(xmlSecTransformCtxPtr, const_xmlSecByte*, xmlSecSize) nogil

0 commit comments

Comments
 (0)