office-gobmx/xmlsecurity/source/helper/xsecctl.hxx
Vladimir Glazounov 5b1ae7a07c INTEGRATION: CWS xmlsec08 (1.6.10); FILE MERGED
2005/01/20 03:34:23 mmi 1.6.10.1: smartcard support
Issue number:  38448
Submitted by:
Reviewed by:
2005-03-10 17:08:35 +00:00

599 lines
21 KiB
C++

/*************************************************************************
*
* $RCSfile: xsecctl.hxx,v $
*
* $Revision: 1.7 $
*
* last change: $Author: vg $ $Date: 2005-03-10 18:08:35 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc., October, 2000
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2000 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* =================================================
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 (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.openoffice.org/license.html.
*
* Software provided under this License is provided on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
* See the License for the specific provisions governing your rights and
* obligations concerning the Software.
*
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
*
* Copyright: 2000 by Sun Microsystems, Inc.
*
* All Rights Reserved.
*
* Contributor(s): _______________________________________
*
*
************************************************************************/
#ifndef _XSEC_CTL_HXX
#define _XSEC_CTL_HXX
#include <xmlsecurity/sigstruct.hxx>
#include <com/sun/star/xml/sax/XParser.hpp>
#include <com/sun/star/lang/XInitialization.hpp>
#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
#include <com/sun/star/xml/sax/XAttributeList.hpp>
#include <com/sun/star/xml/crypto/XXMLSignature.hpp>
#include <com/sun/star/xml/crypto/XSEInitializer.hpp>
#include <com/sun/star/xml/crypto/sax/XSecurityController.hpp>
#include <com/sun/star/xml/crypto/sax/XElementStackKeeper.hpp>
#include <com/sun/star/xml/crypto/sax/XSecuritySAXEventKeeper.hpp>
#include <com/sun/star/xml/crypto/sax/XReferenceResolvedListener.hpp>
#include <com/sun/star/xml/crypto/sax/XSAXEventKeeperStatusChangeListener.hpp>
#include <com/sun/star/xml/crypto/sax/XSignatureCreationResultListener.hpp>
#include <com/sun/star/xml/crypto/sax/XSignatureVerifyResultListener.hpp>
#include <com/sun/star/xml/wrapper/XXMLDocumentWrapper.hpp>
#include <com/sun/star/beans/XFastPropertySet.hpp>
#include <com/sun/star/io/XOutputStream.hpp>
#include <com/sun/star/io/XInputStream.hpp>
#include <rtl/ustrbuf.hxx>
#include <cppuhelper/implbase4.hxx>
#ifndef INCLUDED_VECTOR
#include <vector>
#define INCLUDED_VECTOR
#endif
/*
* all error information
*/
#define ERROR_CANNOTCREATEXMLSECURITYCOMPONENT "Can't create XML security components."
#define ERROR_SAXEXCEPTIONDURINGCREATION "A SAX exception is throwed during signature creation."
#define ERROR_IOEXCEPTIONDURINGCREATION "An IO exception is throwed during signature creation."
#define ERROR_EXCEPTIONDURINGCREATION "An exception is throwed during signature creation."
/*
* all stringS in signature element
*/
#define TAG_SIGNATURE "Signature"
#define TAG_SIGNEDINFO "SignedInfo"
#define TAG_CANONICALIZATIONMETHOD "CanonicalizationMethod"
#define TAG_SIGNATUREMETHOD "SignatureMethod"
#define TAG_REFERENCE "Reference"
#define TAG_TRANSFORMS "Transforms"
#define TAG_TRANSFORM "Transform"
#define TAG_DIGESTMETHOD "DigestMethod"
#define TAG_DIGESTVALUE "DigestValue"
#define TAG_SIGNATUREVALUE "SignatureValue"
#define TAG_KEYINFO "KeyInfo"
#define TAG_X509DATA "X509Data"
#define TAG_X509ISSUERSERIAL "X509IssuerSerial"
#define TAG_X509ISSUERNAME "X509IssuerName"
#define TAG_X509SERIALNUMBER "X509SerialNumber"
#define TAG_X509CERTIFICATE "X509Certificate"
#define TAG_OBJECT "Object"
#define TAG_SIGNATUREPROPERTIES "SignatureProperties"
#define TAG_SIGNATUREPROPERTY "SignatureProperty"
#define TAG_TIMESTAMP "timestamp"
#define TAG_DATE "date"
//#define TAG_TIME "time"
#define ATTR_XMLNS "xmlns"
#define ATTR_ALGORITHM "Algorithm"
#define ATTR_URI "URI"
#define ATTR_ID "Id"
#define ATTR_TARGET "Target"
#define NSTAG_DC "dc"
#define NS_XMLDSIG "http://www.w3.org/2000/09/xmldsig#"
//#define NS_DATETIME "http://www.ietf.org/rfcXXXX.txt"
#define NS_DC "http://purl.org/dc/elements/1.1/"
#define ALGO_C14N "http://www.w3.org/TR/2001/REC-xml-c14n-20010315"
#define ALGO_RSASHA1 "http://www.w3.org/2000/09/xmldsig#rsa-sha1"
#define ALGO_XMLDSIGSHA1 "http://www.w3.org/2000/09/xmldsig#sha1"
#define CHAR_FRAGMENT "#"
#define CHAR_BLANK " "
/*
* status of security related components
*/
#define UNINITIALIZED 0
#define INITIALIZED 1
#define FAILTOINITIALIZED 2
#define RTL_ASCII_USTRINGPARAM( asciiStr ) asciiStr, strlen( asciiStr ), RTL_TEXTENCODING_ASCII_US
class InternalSignatureInformation
{
public:
SignatureInformation signatureInfor;
com::sun::star::uno::Reference<
com::sun::star::xml::crypto::sax::XReferenceResolvedListener >
xReferenceResolvedListener;
::std::vector< sal_Int32 > vKeeperIds;
InternalSignatureInformation(
sal_Int32 nId,
com::sun::star::uno::Reference< com::sun::star::xml::crypto::sax::XReferenceResolvedListener >
xListener)
:signatureInfor(nId)
{
xReferenceResolvedListener = xListener;
}
void addReference( sal_Int32 type, rtl::OUString uri, sal_Int32 keeperId )
{
signatureInfor.vSignatureReferenceInfors.push_back(
SignatureReferenceInformation(type, uri));
vKeeperIds.push_back( keeperId );
}
};
typedef ::std::vector< InternalSignatureInformation > InternalSignatureInformations;
class XSecController : public cppu::WeakImplHelper4
<
com::sun::star::xml::crypto::sax::XSecurityController,
//com::sun::star::beans::XFastPropertySet,
com::sun::star::xml::crypto::sax::XSAXEventKeeperStatusChangeListener,
com::sun::star::xml::crypto::sax::XSignatureCreationResultListener,
com::sun::star::xml::crypto::sax::XSignatureVerifyResultListener
>
/****** XSecController.hxx/CLASS XSecController *******************************
*
* NAME
* XSecController -- the xml security framework controller
*
* FUNCTION
* Controlls the whole xml security framework to create signatures or to
* verify signatures.
*
* HISTORY
* 05.01.2004 - Interface supported: XSecurityController,
* XFastPropertySet, XSAXEventKeeperStatusChangeListener,
* XSignatureCreationResultListener,
* XSignatureVerifyResultListener
*
* NOTES
* The XFastPropertySet interface is used to transfer common values to
* classes in other module, for instance, the signature id for all
* sessions is transferred to xmloff module through this interface.
*
* AUTHOR
* Michael Mi
* Email: michael.mi@sun.com
******************************************************************************/
{
friend class XSecParser;
private:
com::sun::star::uno::Reference<
com::sun::star::lang::XMultiServiceFactory> mxMSF;
/*
* used to buffer SAX events
*/
com::sun::star::uno::Reference<
com::sun::star::xml::wrapper::XXMLDocumentWrapper > m_xXMLDocumentWrapper;
/*
* the SAX events keeper
*/
com::sun::star::uno::Reference<
com::sun::star::xml::crypto::sax::XSecuritySAXEventKeeper > m_xSAXEventKeeper;
/*
* the bridge component which creates/verifies signature
*/
com::sun::star::uno::Reference<
com::sun::star::xml::crypto::XXMLSignature > m_xXMLSignature;
/*
* the Security Context
*/
com::sun::star::uno::Reference<
com::sun::star::xml::crypto::XXMLSecurityContext > m_xSecurityContext;
#if 0
/*
* the signature creation result listener
*/
com::sun::star::uno::Reference<
com::sun::star::xml::crypto::sax::XSignatureCreationResultListener > m_xSignatureCreationResultListener;
/*
* the signature verify result listener
*/
com::sun::star::uno::Reference<
com::sun::star::xml::crypto::sax::XSignatureVerifyResultListener > m_xSignatureVerifyResultListener;
#endif
/*
* the security id incrementer, in order to make any security id unique
* to the SAXEventKeeper.
* Because each XSecController has its own SAXEventKeeper, so this variable
* is not necessary to be static.
*/
sal_Int32 m_nNextSecurityId;
/*
* Signature information
*/
InternalSignatureInformations m_vInternalSignatureInformations;
/*
* the previous node on the SAX chain.
* The reason that use a Reference<XInterface> type variable
* is that the previous components are different when exporting
* and importing, and there is no other common interface they
* can provided.
*/
com::sun::star::uno::Reference<
com::sun::star::uno::XInterface > m_xPreviousNodeOnSAXChain;
/*
* whether the preivous node can provide an XInitiazlize interface,
* use this variable in order to typecast the XInterface to the
* correct interface type.
*/
bool m_bIsPreviousNodeInitializable;
/*
* the next node on the SAX chain.
* it can always provide an XDocumentHandler interface.
*/
com::sun::star::uno::Reference<
com::sun::star::xml::sax::XDocumentHandler > m_xNextNodeOnSAXChain;
/*
* the ElementStackKeeper is used to reserve the key SAX events.
* when the SAXEventKeeper is chained on the SAX chain, it need
* first get all missed key SAX events in order to make sure the
* DOM tree it buffering has the same structure with the original
* document.
*
* For a given section of a SAX event stream, the key SAX events
* are the minimal SAX event subset of that section, which,
* combining with SAX events outside of this section, has the same
* structure with the original document.
*
* For example, sees the following dom fragment:
* <A>
* <B/>
* <C>
* <D>
* <E/>
* </D>
* </C>
* </A>
*
* If we consider the SAX event section from startElement(<A>) to
* startElement(<D>), then the key SAX events are:
*
* startElement(<A>), startElement(<C>), startElement(<D>)
*
* The startElement(<B>) and endElement(<B>) is ignored, because
* they are unimportant for the tree structure in this section.
*
* If we consider the SAX event section from startElement(<D>) to
* endElement(<A>), the key SAX events are:
*
* startElement(<D>), endElement(<D>), endElement(<C>),
* endElement(<A>).
*/
com::sun::star::uno::Reference<
com::sun::star::xml::crypto::sax::XElementStackKeeper > m_xElementStackKeeper;
/*
* a flag representing whether the SAXEventKeeper is now on the
* SAX chain.
*/
bool m_bIsSAXEventKeeperConnected;
/*
* a flag representing whether it is collecting some element,
* which means that the SAXEventKeeper can't be chained off the
* SAX chain.
*/
bool m_bIsCollectingElement;
/*
* a flag representing whether the SAX event stream is blocking,
* which also means that the SAXEventKeeper can't be chained off
* the SAX chain.
*/
bool m_bIsBlocking;
/*
* a flag representing the current status of security related
* components.
*/
sal_Int32 m_nStatusOfSecurityComponents;
/*
* a flag representing whether the SAXEventKeeper need to be
* on the SAX chain all the time.
* This flag is used to the situation when creating signature.
*/
bool m_bIsSAXEventKeeperSticky;
/*
* fast property vector
*/
std::vector< sal_Int32 > m_vFastPropertyIndexs;
std::vector< com::sun::star::uno::Any > m_vFastPropertyValues;
/*
* error message pointer
*/
const char *m_pErrorMessage;
/*
* the XSecParser which is used to parse the signature stream
*/
XSecParser *m_pXSecParser;
/*
* the caller assigned signature id for the next signature in the
* signature stream
*/
sal_Int32 m_nReservedSignatureId;
/*
* representing whether to verify the current signature
*/
bool m_bVerifyCurrentSignature;
public:
/*
* An xUriBinding is provided to map Uris to XInputStream interfaces.
*/
com::sun::star::uno::Reference<
com::sun::star::xml::crypto::XUriBinding > m_xUriBinding;
private:
/*
* Common methods
*/
sal_Bool convertNumber( sal_Int32& rValue, const rtl::OUString& rString, sal_Int32 nMin, sal_Int32 nMax );
void convertDateTime( ::rtl::OUStringBuffer& rBuffer, const com::sun::star::util::DateTime& rDateTime );
sal_Bool convertDateTime( com::sun::star::util::DateTime& rDateTime, const ::rtl::OUString& rString );
void createXSecComponent( );
int findSignatureInfor( sal_Int32 nSecurityId ) const;
bool chainOn( bool bRetrievingLastEvent );
void chainOff();
void checkChainingStatus();
void initializeSAXChain();
com::sun::star::uno::Reference<
com::sun::star::io::XInputStream > getObjectInputStream( const rtl::OUString& objectURL );
//sal_Int32 getFastPropertyIndex(sal_Int32 nHandle) const;
/*
* For signature generation
*/
rtl::OUString createId();
com::sun::star::uno::Reference<
com::sun::star::xml::crypto::sax::XReferenceResolvedListener > prepareSignatureToWrite(
InternalSignatureInformation& signatureInfo );
/*
* For signature verification
*/
void addSignature();
void addReference( const rtl::OUString& ouUri);
void addStreamReference(
const rtl::OUString& ouUri,
bool isBinary );
void setReferenceCount() const;
void setX509IssuerName( rtl::OUString& ouX509IssuerName );
void setX509SerialNumber( rtl::OUString& ouX509SerialNumber );
void setX509Certificate( rtl::OUString& ouX509Certificate );
void setSignatureValue( rtl::OUString& ouSignatureValue );
void setDigestValue( rtl::OUString& ouDigestValue );
void setDate( rtl::OUString& ouDate );
void setId( rtl::OUString& ouId );
void setPropertyId( rtl::OUString& ouPropertyId );
com::sun::star::uno::Reference<
com::sun::star::xml::crypto::sax::XReferenceResolvedListener > prepareSignatureToRead(
sal_Int32 nSecurityId );
public:
XSecController();
~XSecController();
/*
* Common methods
*/
void setFactory( const com::sun::star::uno::Reference<
com::sun::star::lang::XMultiServiceFactory>& rxMSF);
#if 0
void setSignatureCreationResultListener( const com::sun::star::uno::Reference<
com::sun::star::xml::crypto::sax::XSignatureCreationResultListener >& xSignatureCreationResultListener);
void setSignatureVerifyResultListener( const com::sun::star::uno::Reference<
com::sun::star::xml::crypto::sax::XSignatureVerifyResultListener >& xSignatureVerifyResultListener);
#endif
sal_Int32 getNewSecurityId( );
void startMission( const com::sun::star::uno::Reference<
com::sun::star::xml::crypto::XUriBinding >& xUriBinding,
const com::sun::star::uno::Reference<
com::sun::star::xml::crypto::XXMLSecurityContext >& xSecurityContext );
void setSAXChainConnector(
const com::sun::star::uno::Reference<
com::sun::star::lang::XInitialization >& xInitialization,
const com::sun::star::uno::Reference<
com::sun::star::xml::sax::XDocumentHandler >& xDocumentHandler,
const com::sun::star::uno::Reference<
com::sun::star::xml::crypto::sax::XElementStackKeeper >& xElementStackKeeper);
void setSAXChainConnector(
const com::sun::star::uno::Reference<
com::sun::star::xml::sax::XParser >& xParser,
const com::sun::star::uno::Reference<
com::sun::star::xml::sax::XDocumentHandler >& xDocumentHandler,
const com::sun::star::uno::Reference<
com::sun::star::xml::crypto::sax::XElementStackKeeper >& xElementStackKeeper);
void clearSAXChainConnector();
void endMission();
const char* getErrorMessage();
SignatureInformation getSignatureInformation( sal_Int32 nSecurityId ) const;
SignatureInformations getSignatureInformations() const;
void exportSignature(
const com::sun::star::uno::Reference<
com::sun::star::xml::sax::XDocumentHandler >& xDocumentHandler,
const SignatureInformation& signatureInfo );
/*
* For signature generation
*/
void collectToSign( sal_Int32 securityId, const rtl::OUString& referenceId );
void signAStream( sal_Int32 securityId, const rtl::OUString& uri, const rtl::OUString& objectURL, sal_Bool isBinary);
void setX509Certificate(
sal_Int32 nSecurityId,
const rtl::OUString& ouX509IssuerName,
const rtl::OUString& ouX509SerialNumber);
void setX509Certificate(
sal_Int32 nSecurityId,
const sal_Int32 nSecurityEnvironmentIndex,
const rtl::OUString& ouX509IssuerName,
const rtl::OUString& ouX509SerialNumber);
void setDate(
sal_Int32 nSecurityId,
const ::com::sun::star::util::DateTime& rDateTime );
bool WriteSignature(
const com::sun::star::uno::Reference<
com::sun::star::xml::sax::XDocumentHandler >& xDocumentHandler );
/*
* For signature verification
*/
void collectToVerify( const rtl::OUString& referenceId );
void addSignature( sal_Int32 nSignatureId );
com::sun::star::uno::Reference< com::sun::star::xml::sax::XDocumentHandler > createSignatureReader();
void releaseSignatureReader();
public:
/* Interface methods */
/*
* XSecurityController
*
* no method in XSecurityController interface
*/
/*
* XFastPropertySet
*/
/*
virtual void SAL_CALL setFastPropertyValue(
sal_Int32 nHandle,
const com::sun::star::uno::Any& aValue )
throw (
com::sun::star::beans::UnknownPropertyException,
com::sun::star::beans::PropertyVetoException,
com::sun::star::lang::IllegalArgumentException,
com::sun::star::lang::WrappedTargetException,
com::sun::star::uno::RuntimeException);
virtual com::sun::star::uno::Any SAL_CALL getFastPropertyValue(
sal_Int32 nHandle )
throw (
com::sun::star::beans::UnknownPropertyException,
com::sun::star::lang::WrappedTargetException,
com::sun::star::uno::RuntimeException);
*/
/*
* XSAXEventKeeperStatusChangeListener
*/
virtual void SAL_CALL blockingStatusChanged( sal_Bool isBlocking )
throw (com::sun::star::uno::RuntimeException);
virtual void SAL_CALL collectionStatusChanged(
sal_Bool isInsideCollectedElement )
throw (com::sun::star::uno::RuntimeException);
virtual void SAL_CALL bufferStatusChanged( sal_Bool isBufferEmpty )
throw (com::sun::star::uno::RuntimeException);
/*
* XSignatureCreationResultListener
*/
virtual void SAL_CALL signatureCreated( sal_Int32 securityId, com::sun::star::xml::crypto::SecurityOperationStatus nResult )
throw (com::sun::star::uno::RuntimeException);
/*
* XSignatureVerifyResultListener
*/
virtual void SAL_CALL signatureVerified( sal_Int32 securityId, com::sun::star::xml::crypto::SecurityOperationStatus nResult )
throw (com::sun::star::uno::RuntimeException);
};
#endif