Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions setup.cfg
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
[pytest]
addopts = tests -s -rx
[bdist_rpm]
release = 1
build-requires = pkgconfig xmlsec1-devel libxml2-devel xmlsec1-openssl-devel
group = Development/Libraries
requires = xmlsec1 xmlsec1-openssl
68 changes: 21 additions & 47 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,75 +12,45 @@ def lazy(function):
@wraps(function)
def wrapped(*args, **kwargs):

class LazyProxy(object):
class LazyProxy(Extension):
__arguments = dict()

def __init__(self, function, args, kwargs):
self._function = function
self._args = args
self._kwargs = kwargs
self._result = None
self.__arguments["function"] = function
self.__arguments["args"] = args
self.__arguments["kwargs"] = kwargs
self.__arguments["result"] = None

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

if self._result is None:
self._result = self._function(*self._args, **self._kwargs)

return object.__getattribute__(self._result, name)
return getattr(self.__arguments["result"], item)

def __setattr__(self, name, value):
if name in ['_function', '_args', '_kwargs', '_result']:
super(LazyProxy, self).__setattr__(name, value)
return

if self._result is None:
self._result = self._function(*self._args, **self._kwargs)
if self.__arguments["result"] is None:
self.__arguments["result"] = self.__arguments["function"](*self.__arguments["args"],
**self.__arguments["kwargs"])

setattr(self._result, name, value)
setattr(self.__arguments["result"], name, value)

return LazyProxy(function, args, kwargs)

return wrapped


class Extension(Extension, object):

lxml_extended = False

@property
def include_dirs(self):
dirs = self.__dict__['include_dirs']
if self.lxml_extended:
return dirs

# Resolve lxml include directories.
import lxml
lxml_base = path.dirname(lxml.__file__)
lxml_include = path.join(lxml_base, 'includes')

dirs.insert(0, lxml_include)
dirs.insert(0, lxml_base)

self.lxml_extended = True
return dirs

@include_dirs.setter
def include_dirs(self, dirs):
self.__dict__['include_dirs'] = dirs


@lazy
def make_extension(name, cython=True):
from pkgconfig import parse

# Declare the crypto implementation.
XMLSEC_CRYPTO = 'openssl'
xmlsec_crypto = 'openssl'

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

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

# Add the source directories for inclusion.
import lxml
config['include_dirs'].insert(0, path.dirname(lxml.__file__))
config['include_dirs'].insert(0, path.join(path.dirname(lxml.__file__), 'includes'))
config['include_dirs'].insert(0, 'src')

# Resolve extension location from name.
Expand Down Expand Up @@ -144,6 +117,7 @@ def make_extension(name, cython=True):
make_extension('xmlsec.tree'),
make_extension('xmlsec.key'),
make_extension('xmlsec.ds'),
make_extension('xmlsec.enc'),
make_extension('xmlsec.template'),
]
)
2 changes: 2 additions & 0 deletions src/xmlsec/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
from .utils import *
from .key import *
from .ds import *
from .enc import *
from .error import *
from . import tree, template


Expand Down
30 changes: 30 additions & 0 deletions src/xmlsec/constants.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,40 @@ cdef extern from "xmlsec.h": # xmlsec/strings.h
const_xmlChar* xmlSecNodeManifest
const_xmlChar* xmlSecNodeSignatureProperties

# Encypted nodes
const_xmlChar* xmlSecNodeEncryptedData
const_xmlChar* xmlSecNodeEncryptedKey
const_xmlChar* xmlSecNodeEncryptionMethod
const_xmlChar* xmlSecNodeEncryptionProperties
const_xmlChar* xmlSecNodeEncryptionProperty
const_xmlChar* xmlSecNodeCipherData
const_xmlChar* xmlSecNodeCipherValue
const_xmlChar* xmlSecNodeCipherReference
const_xmlChar* xmlSecNodeReferenceList
const_xmlChar* xmlSecNodeDataReference
const_xmlChar* xmlSecNodeKeyReference
const_xmlChar* xmlSecNodeKeyInfo


# encryption types
const_xmlChar* xmlSecTypeEncContent
const_xmlChar* xmlSecTypeEncElement

ctypedef unsigned int xmlSecTransformUsage
cdef enum:
xmlSecTransformUsageUnknown=0x0000
xmlSecTransformUsageDSigTransform=0x0001
xmlSecTransformUsageC14NMethod=0x0002
xmlSecTransformUsageDigestMethod=0x0004
xmlSecTransformUsageSignatureMethod=0x0008
xmlSecTransformUsageEncryptionMethod=0x0010
xmlSecTransformUsageAny=0xFFFF

# Transform ids
cdef struct _xmlSecTransformKlass:
const_xmlChar* name
const_xmlChar* href
xmlSecTransformUsage usage

ctypedef _xmlSecTransformKlass *xmlSecTransformId

Expand Down
38 changes: 35 additions & 3 deletions src/xmlsec/constants.pyx
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals, division

from xmlsec.constants cimport *
from xmlsec.utils cimport *
from .constants cimport *
from .utils cimport *

__all__ = [
'Namespace',
'Node',
'Transform'
'Transform',
'EncryptionType'
]


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


class EncryptionType:
CONTENT = _u(xmlSecTypeEncContent)
ELEMENT = _u(xmlSecTypeEncElement)


class Node:
"""Digital signature nodes."""
SIGNATURE = _u(xmlSecNodeSignature)
Expand All @@ -36,6 +42,32 @@ class Node:
OBJECT = _u(xmlSecNodeObject)
MANIFEST = _u(xmlSecNodeManifest)
SIGNATURE_PROPERTIES = _u(xmlSecNodeSignatureProperties)
ENCRYPTED_DATA = _u(xmlSecNodeEncryptedData)
ENCRYPTED_KEY = _u(xmlSecNodeEncryptedKey)
ENCRYPTION_METHOD = _u(xmlSecNodeEncryptionMethod)
ENCRYPTION_PROPERTIES = _u(xmlSecNodeEncryptionProperties)
ENCRYPTION_PROPERTY = _u(xmlSecNodeEncryptionProperty)
CIPHER_DATA = _u(xmlSecNodeCipherData)
CIPHER_VALUE = _u(xmlSecNodeCipherValue)
CIPHER_REFERENCE = _u(xmlSecNodeCipherReference)
REFERENCE_LIST = _u(xmlSecNodeReferenceList)
DATA_REFERENCE = _u(xmlSecNodeDataReference)
KEY_REFERENCE = _u(xmlSecNodeKeyReference)
KEY_INFO = _u(xmlSecNodeKeyInfo)


cdef class _Transform:
property name:
def __get__(self):
return _u(self.target.name)

property href:
def __get__(self):
return _u(self.target.href)

property usage:
def __get__(self):
return self.target.usage


cdef _Transform _mkti(xmlSecTransformId target):
Expand Down
87 changes: 75 additions & 12 deletions src/xmlsec/ds.pxd
Original file line number Diff line number Diff line change
@@ -1,11 +1,66 @@
from lxml.includes.tree cimport xmlNode
from lxml.includes.tree cimport const_xmlChar, xmlNode, xmlID, xmlDoc, xmlAttr
from lxml.includes.dtdvalid cimport xmlValidCtxt
from xmlsec.key cimport xmlSecKeyPtr
from .key cimport xmlSecKeyPtr, xmlSecKeyReq, xmlSecKeyReqPtr, xmlSecKeysMngrPtr
from .constants cimport xmlSecTransformId


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

ctypedef unsigned int xmlSecSize
ctypedef unsigned char xmlSecByte
ctypedef xmlSecByte const_xmlSecByte "const xmlSecByte"

ctypedef void * xmlSecPtrList
ctypedef xmlSecPtrList * xmlSecPtrListPtr
ctypedef void * xmlSecPtr

int xmlSecPtrListAdd(xmlSecPtrListPtr, xmlSecPtr) nogil

int xmlSecPtrListEmpty(xmlSecPtrListPtr) nogil

cdef struct _xmlSecBuffer:
xmlSecByte* data
size_t size
# size_t maxSize
# xmlSecAllocMode allocMode

ctypedef _xmlSecBuffer *xmlSecBufferPtr

# transforms and transform contexts (partial)
ctypedef enum xmlSecTransformStatus:
xmlSecTransformStatusNone = 0
xmlSecTransformStatusWorking
xmlSecTransformStatusFinished
xmlSecTransformStatusOk
xmlSecTransformStatusFail

ctypedef enum xmlSecTransformOperation:
xmlSecTransformOperationNone = 0
xmlSecTransformOperationEncode
xmlSecTransformOperationDecode
xmlSecTransformOperationSign
xmlSecTransformOperationVerify
xmlSecTransformOperationEncrypt
xmlSecTransformOperationDecrypt

cdef struct _xmlSecTransform:
xmlSecTransformOperation operation
xmlSecTransformStatus status

ctypedef _xmlSecTransform* xmlSecTransformPtr

cdef struct _xmlSecTransformCtx:
xmlSecBufferPtr result
xmlSecTransformStatus status

ctypedef _xmlSecTransformCtx xmlSecTransformCtx
ctypedef _xmlSecTransformCtx* xmlSecTransformCtxPtr

cdef struct xmlSecKeyInfoCtx:
xmlSecPtrList enabledKeyData
xmlSecKeyReq keyReq

ctypedef enum xmlSecDSigStatus:
xmlSecDSigStatusUnknown = 0
xmlSecDSigStatusSucceeded = 1
Expand All @@ -15,20 +70,20 @@ cdef extern from "xmlsec.h": # xmlsec/keys.h
# void* userData
# unsigned int flags
# unsigned int flags2
# xmlSecKeyInfoCtx keyInfoReadCtx
xmlSecKeyInfoCtx keyInfoReadCtx
# xmlSecKeyInfoCtx keyInfoWriteCtx
# xmlSecTransformCtx transformCtx
xmlSecTransformCtx transformCtx
# xmlSecTransformUriType enabledReferenceUris
# xmlSecPtrListPtr enabledReferenceTransforms
# xmlSecTransformCtxPreExecuteCallback referencePreExecuteCallback
# xmlSecTransformId defSignMethodId
# xmlSecTransformId defC14NMethodId
# xmlSecTransformId defDigestMethodId
xmlSecKeyPtr signKey
# xmlSecTransformOperation operation
xmlSecTransformOperation operation
# xmlSecBufferPtr result
xmlSecDSigStatus status
# xmlSecTransformPtr signMethod
xmlSecTransformPtr signMethod
# xmlSecTransformPtr c14nMethod
# xmlSecTransformPtr preSignMemBufMethod
# xmlNode* signValueNode
Expand All @@ -40,7 +95,6 @@ cdef extern from "xmlsec.h": # xmlsec/keys.h

ctypedef _xmlSecDSigCtx* xmlSecDSigCtxPtr

ctypedef void* xmlSecKeysMngrPtr

xmlSecDSigCtxPtr xmlSecDSigCtxCreate(xmlSecKeysMngrPtr) nogil

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

int xmlSecDSigCtxVerify(xmlSecDSigCtxPtr, xmlNode*) nogil

# int xmlSecDSigCtxEnableReferenceTransform(
# xmlSecDSigCtxPtr, xmlSecTransformId) nogil
int xmlSecDSigCtxEnableReferenceTransform(
xmlSecDSigCtxPtr, xmlSecTransformId) nogil

# int xmlSecDSigCtxEnableSignatureTransform(
# xmlSecDSigCtxPtr, xmlSecTransformId) nogil
int xmlSecDSigCtxEnableSignatureTransform(
xmlSecDSigCtxPtr, xmlSecTransformId) nogil

void xmlSecDSigCtxDestroy(xmlSecDSigCtxPtr) nogil

xmlID* xmlAddID(
xmlValidCtxt* ctx, xmlDoc* doc, const_xmlChar* value, xmlAttr* attr);
xmlID* xmlAddID(xmlValidCtxt* ctx, xmlDoc* doc, const_xmlChar* value, xmlAttr* attr)

xmlSecTransformPtr xmlSecTransformCtxCreateAndAppend(xmlSecTransformCtxPtr, xmlSecTransformId) nogil

int xmlSecTransformSetKey(xmlSecTransformPtr, xmlSecKeyPtr) nogil

int xmlSecTransformSetKeyReq(xmlSecTransformPtr, xmlSecKeyReqPtr) nogil

int xmlSecTransformVerify(xmlSecTransformPtr, const_xmlSecByte*, xmlSecSize, xmlSecTransformCtxPtr) nogil

int xmlSecTransformCtxBinaryExecute(xmlSecTransformCtxPtr, const_xmlSecByte*, xmlSecSize) nogil
Loading