blob: cc647c2b5df92130dde7d4843e3b2ae135b584fe [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*
* XSEC
*
* XSECProvider.hpp := Main interface class that applications use to
* get access to Signature and Encryption functions.
*
* $Id$
*
*/
#ifndef XSECPROVIDER_INCLUDE
#define XSECPROVIDER_INCLUDE
#include <xsec/utils/XSECPlatformUtils.hpp>
#include <xsec/dsig/DSIGSignature.hpp>
#include <xsec/xenc/XENCCipher.hpp>
#include <xsec/xkms/XKMSMessageFactory.hpp>
#include <xercesc/util/Mutexes.hpp>
#include <vector>
/**
* @addtogroup pubsig
* @{
*/
/**
* @brief The main provider class for XML Digital Signatures and Encryption objects.
*
* <p>The XSECProvider class is used to create and destroy signature objects and
* encryption objects. It provides a number of methods to create signature
* and encryption objects for a variety of situations - in particular creating an
* empty signature or cipher with which to create the DOM structure or creating a
* security object based on an already existing DOM structure.</p>
*
*/
class DSIG_EXPORT XSECProvider {
#if defined(XALAN_NO_NAMESPACES)
typedef vector<DSIGSignature *> SignatureListVectorType;
#else
typedef std::vector<DSIGSignature *> SignatureListVectorType;
#endif
#if defined(XALAN_NO_NAMESPACES)
typedef vector<XENCCipher *> CipherListVectorType;
#else
typedef std::vector<XENCCipher *> CipherListVectorType;
#endif
public:
/** @name Constructors and Destructors */
//@{
/**
* \brief Default constructor.
*
* <p>The provider class requires no parameters for construction</p>
*
*/
XSECProvider();
~XSECProvider();
//@}
/** @name Signature Creation Classes */
//@{
/**
* \brief DSIGSignature creator for use with existing XML signatures or templates.
*
* <p>Create a DSIGSignature object based on an already existing
* DSIG Signature XML node. It is assumed that the underlying
* DOM structure is in place and works correctly.</p>
*
* <p>In this case, the caller can pass in the signature DOM Node for cases
* where there may be more than one signature in a document. The caller
* needs to specify which signature tree is to be used.</p>
*
* @param doc The DOM document node in which the signature is embedded.
* @param sigNode The DOM node (within doc) that is to be used as the
* base of the signature.
* @see DSIGSignature#load
*/
DSIGSignature * newSignatureFromDOM(
XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *doc,
XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *sigNode
);
/**
* \brief DSIGSignature creator for use with existing XML signatures or templates.
*
* <p>Create a DSIGSignature object based on an already existing
* DSIG Signature XML node. It is assumed that the underlying
* DOM structure is in place and works correctly.</p>
*
* <p>In this case, the XML-Security libraries will find the signature
* node.</p>
*
* @note The library will <em>only</em> find and use the first signature node
* in the document. If there are more, they will not be validated
* @param doc The DOM document node in which the signature is embedded.
* @see DSIGSignature#load
*/
DSIGSignature * newSignatureFromDOM(XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *doc);
/**
* \brief DSIGSignature creator for creating new XML signatures.
*
* <p>Create an empty DSIGSignature object that can be used to create new
* signature values. The returned signature object needs to be initialised
* with a document so a blank signature DOM structure can be created</p>
*
* @see DSIGSignature#createBlankSignature
*/
DSIGSignature * newSignature(void);
/**
* \brief Method for destroying DSIGSignature objects created via this provider.
*
* <p>The provider keeps track of all signature objects created during the lifetime
* of the provider. This method can be called to delete a signature whilst the
* provider is still in scope. Otherwise the objects will be automatically
* deleted when the provider object goes out of scope.</p>
*
* <p>In cases where the DSIGSignature has been used to create a new DOM structure,
* it can be safely deleted once the signature operations have been completed without
* impacting the underlying DOM structure.</p>
*
* @param toRelease The DSIGSignature object to be deleted.
* @todo The DSIGSignature objects are fairly bulky in terms of creation and deletion.
* There should be a capability to store "released" objects in a re-use stack. At the
* moment the Provider class simply deletes the objects.
* @see DSIGSignature#createBlankSignature
*/
void releaseSignature(DSIGSignature * toRelease);
//@}
/** @name Encryption Creation Functions */
//@{
/**
* \brief Create an XENCCipher object based on a particular DOM Document
*
* XENCCipher is an engine class that is used to wrap encryption/decryption
* functions. Unlike the Signature functions, only a XENCCipher object attached
* to a particular document is required. Arbitrary objects within this document
* can then be encrypted/decrypted using this class.
*
* @param doc Document to attach the XENCCipher to.
* @returns An implementation object for XENCCipher
*/
XENCCipher * newCipher(XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * doc);
/**
* \brief Method to delete XENCCipher objects created via this provider
*
* <p>The provider keeps track of all objects by it. This method can be used
* to delete any previously created XENCCipher objects prior to the provider
* being deleted. Any XENCCipher objects not released using this function will
* automatically be deleted when the provider goes out of scope (or is itself
* deleted).
*
* @param toRelease The XENCCipher object to be deleted
*/
void releaseCipher(XENCCipher * toRelease);
//@}
/** @name XKMS Functions */
//@{
/**
* \brief Obtain a pointer to the XKMSMessageFactory.
*
* The XKMSMessageFactory is used to create and manipulate XKMS messages.
*
* @note Unlike other objects created by the provider, only one
* XKMSMessageFactory is ever instantiated for a particular provider.
* Applications should <b>never</b> delete the Factory, as it is taken
* care of by the provider.
*/
XKMSMessageFactory * getXKMSMessageFactory(void);
/** @name Environmental Options */
//@{
/**
* \brief Set the default URIResolver.
*
* DSIGSignature objects require a URIResolver to allow them to de-reference
* URIs in reference elements.
*
* This function sets the resolver that will be used for all
* signatures created after this is set. The resolver is
* cloned, so the object passed in can be safely deleted once the
* function has been completed.
*/
void setDefaultURIResolver(XSECURIResolver * resolver);
//@}
private:
// Copy constructor is disabled
XSECProvider(const XSECProvider &);
XSECProvider * operator = (const XSECProvider &);
// Internal functions
void setup(DSIGSignature *sig);
void setup(XENCCipher *cipher);
SignatureListVectorType m_activeSignatures;
CipherListVectorType m_activeCiphers;
XKMSMessageFactory * mp_xkmsMessageFactory;
XSECURIResolver * mp_URIResolver;
XERCES_CPP_NAMESPACE_QUALIFIER XMLMutex m_providerMutex;
};
/** @} */
#endif /* XSECPROVIDER_INCLUDE */