xref: /trunk/main/xmlsecurity/source/framework/signatureengine.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1*06b3ce53SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*06b3ce53SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*06b3ce53SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*06b3ce53SAndrew Rist  * distributed with this work for additional information
6*06b3ce53SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*06b3ce53SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*06b3ce53SAndrew Rist  * "License"); you may not use this file except in compliance
9*06b3ce53SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*06b3ce53SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*06b3ce53SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*06b3ce53SAndrew Rist  * software distributed under the License is distributed on an
15*06b3ce53SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*06b3ce53SAndrew Rist  * KIND, either express or implied.  See the License for the
17*06b3ce53SAndrew Rist  * specific language governing permissions and limitations
18*06b3ce53SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*06b3ce53SAndrew Rist  *************************************************************/
21*06b3ce53SAndrew Rist 
22*06b3ce53SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_xmlsecurity.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include "signatureengine.hxx"
28cdf0e10cSrcweir #include <com/sun/star/xml/crypto/XXMLSignatureTemplate.hpp>
29cdf0e10cSrcweir #include <com/sun/star/xml/wrapper/XXMLElementWrapper.hpp>
30cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir namespace cssu = com::sun::star::uno;
33cdf0e10cSrcweir namespace cssl = com::sun::star::lang;
34cdf0e10cSrcweir namespace cssxc = com::sun::star::xml::crypto;
35cdf0e10cSrcweir namespace cssxw = com::sun::star::xml::wrapper;
36cdf0e10cSrcweir 
37cdf0e10cSrcweir #define SIGNATURE_TEMPLATE "com.sun.star.xml.crypto.XMLSignatureTemplate"
38cdf0e10cSrcweir 
39cdf0e10cSrcweir #define DECLARE_ASCII( SASCIIVALUE )                                                                            \
40cdf0e10cSrcweir     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( SASCIIVALUE ) )
41cdf0e10cSrcweir 
SignatureEngine()42cdf0e10cSrcweir SignatureEngine::SignatureEngine( )
43cdf0e10cSrcweir     :m_nTotalReferenceNumber(-1)
44cdf0e10cSrcweir {
45cdf0e10cSrcweir }
46cdf0e10cSrcweir 
checkReady() const47cdf0e10cSrcweir bool SignatureEngine::checkReady() const
48cdf0e10cSrcweir /****** SignatureEngine/checkReady *******************************************
49cdf0e10cSrcweir  *
50cdf0e10cSrcweir  *   NAME
51cdf0e10cSrcweir  *  checkReady -- checks the conditions for the main operation.
52cdf0e10cSrcweir  *
53cdf0e10cSrcweir  *   SYNOPSIS
54cdf0e10cSrcweir  *  bReady = checkReady( );
55cdf0e10cSrcweir  *
56cdf0e10cSrcweir  *   FUNCTION
57cdf0e10cSrcweir  *  checks whether all following conditions are satisfied:
58cdf0e10cSrcweir  *  1. the main operation has't begun yet;
59cdf0e10cSrcweir  *  2. the key material is known;
60cdf0e10cSrcweir  *  3. the amount of reference is known;
61cdf0e10cSrcweir  *  4. all of referenced elements, the key element and the signature
62cdf0e10cSrcweir  *     template are bufferred.
63cdf0e10cSrcweir  *
64cdf0e10cSrcweir  *   INPUTS
65cdf0e10cSrcweir  *  empty
66cdf0e10cSrcweir  *
67cdf0e10cSrcweir  *   RESULT
68cdf0e10cSrcweir  *  bReady - true if all conditions are satisfied, false otherwise
69cdf0e10cSrcweir  *
70cdf0e10cSrcweir  *   HISTORY
71cdf0e10cSrcweir  *  05.01.2004 -    implemented
72cdf0e10cSrcweir  *
73cdf0e10cSrcweir  *   AUTHOR
74cdf0e10cSrcweir  *  Michael Mi
75cdf0e10cSrcweir  *  Email: michael.mi@sun.com
76cdf0e10cSrcweir  ******************************************************************************/
77cdf0e10cSrcweir {
78cdf0e10cSrcweir     bool rc = true;
79cdf0e10cSrcweir 
80cdf0e10cSrcweir     sal_Int32 nKeyInc = 0;
81cdf0e10cSrcweir     if (m_nIdOfKeyEC != 0)
82cdf0e10cSrcweir     {
83cdf0e10cSrcweir         nKeyInc = 1;
84cdf0e10cSrcweir     }
85cdf0e10cSrcweir 
86cdf0e10cSrcweir     if (m_bMissionDone ||
87cdf0e10cSrcweir         m_nIdOfKeyEC == -1 ||
88cdf0e10cSrcweir         m_nTotalReferenceNumber == -1 ||
89cdf0e10cSrcweir         m_nTotalReferenceNumber+1+nKeyInc > m_nNumOfResolvedReferences)
90cdf0e10cSrcweir     {
91cdf0e10cSrcweir         rc = false;
92cdf0e10cSrcweir     }
93cdf0e10cSrcweir 
94cdf0e10cSrcweir     return rc;
95cdf0e10cSrcweir }
96cdf0e10cSrcweir 
tryToPerform()97cdf0e10cSrcweir void SignatureEngine::tryToPerform( )
98cdf0e10cSrcweir         throw (cssu::Exception, cssu::RuntimeException)
99cdf0e10cSrcweir /****** SignatureEngine/tryToPerform *****************************************
100cdf0e10cSrcweir  *
101cdf0e10cSrcweir  *   NAME
102cdf0e10cSrcweir  *  tryToPerform -- tries to perform the signature operation.
103cdf0e10cSrcweir  *
104cdf0e10cSrcweir  *   SYNOPSIS
105cdf0e10cSrcweir  *  tryToPerform( );
106cdf0e10cSrcweir  *
107cdf0e10cSrcweir  *   FUNCTION
108cdf0e10cSrcweir  *  if the situation is ready, perform following operations.
109cdf0e10cSrcweir  *  1. prepares a signature template;
110cdf0e10cSrcweir  *  2. calls the signature bridge component;
111cdf0e10cSrcweir  *  3. clears up all used resources;
112cdf0e10cSrcweir  *  4. notifies the result listener;
113cdf0e10cSrcweir  *  5. sets the "accomplishment" flag.
114cdf0e10cSrcweir  *
115cdf0e10cSrcweir  *   INPUTS
116cdf0e10cSrcweir  *  empty
117cdf0e10cSrcweir  *
118cdf0e10cSrcweir  *   RESULT
119cdf0e10cSrcweir  *  empty
120cdf0e10cSrcweir  *
121cdf0e10cSrcweir  *   HISTORY
122cdf0e10cSrcweir  *  05.01.2004 -    implemented
123cdf0e10cSrcweir  *
124cdf0e10cSrcweir  *   AUTHOR
125cdf0e10cSrcweir  *  Michael Mi
126cdf0e10cSrcweir  *  Email: michael.mi@sun.com
127cdf0e10cSrcweir  ******************************************************************************/
128cdf0e10cSrcweir {
129cdf0e10cSrcweir     if (checkReady())
130cdf0e10cSrcweir     {
131cdf0e10cSrcweir         const rtl::OUString ouSignatureTemplate (
132cdf0e10cSrcweir             RTL_CONSTASCII_USTRINGPARAM( SIGNATURE_TEMPLATE ) );
133cdf0e10cSrcweir         cssu::Reference < cssxc::XXMLSignatureTemplate >
134cdf0e10cSrcweir             xSignatureTemplate( mxMSF->createInstance( ouSignatureTemplate ), cssu::UNO_QUERY );
135cdf0e10cSrcweir 
136cdf0e10cSrcweir         OSL_ASSERT( xSignatureTemplate.is() );
137cdf0e10cSrcweir 
138cdf0e10cSrcweir         cssu::Reference< cssxw::XXMLElementWrapper >
139cdf0e10cSrcweir             xXMLElement = m_xSAXEventKeeper->getElement( m_nIdOfTemplateEC );
140cdf0e10cSrcweir 
141cdf0e10cSrcweir         xSignatureTemplate->setTemplate(xXMLElement);
142cdf0e10cSrcweir 
143cdf0e10cSrcweir         std::vector< sal_Int32 >::const_iterator ii = m_vReferenceIds.begin();
144cdf0e10cSrcweir 
145cdf0e10cSrcweir         for( ; ii != m_vReferenceIds.end() ; ++ii )
146cdf0e10cSrcweir         {
147cdf0e10cSrcweir             xXMLElement = m_xSAXEventKeeper->getElement( *ii );
148cdf0e10cSrcweir             xSignatureTemplate->setTarget(xXMLElement);
149cdf0e10cSrcweir         }
150cdf0e10cSrcweir 
151cdf0e10cSrcweir         /*
152cdf0e10cSrcweir          * set the Uri binding
153cdf0e10cSrcweir          */
154cdf0e10cSrcweir         xSignatureTemplate->setBinding( this );
155cdf0e10cSrcweir 
156cdf0e10cSrcweir         startEngine( xSignatureTemplate );
157cdf0e10cSrcweir 
158cdf0e10cSrcweir         /*
159cdf0e10cSrcweir          * done
160cdf0e10cSrcweir          */
161cdf0e10cSrcweir         clearUp( );
162cdf0e10cSrcweir 
163cdf0e10cSrcweir         notifyResultListener();
164cdf0e10cSrcweir 
165cdf0e10cSrcweir         m_bMissionDone = true;
166cdf0e10cSrcweir     }
167cdf0e10cSrcweir }
168cdf0e10cSrcweir 
clearUp() const169cdf0e10cSrcweir void SignatureEngine::clearUp( ) const
170cdf0e10cSrcweir /****** SignatureEngine/clearUp **********************************************
171cdf0e10cSrcweir  *
172cdf0e10cSrcweir  *   NAME
173cdf0e10cSrcweir  *  clearUp -- clear up all resources used by this operation.
174cdf0e10cSrcweir  *
175cdf0e10cSrcweir  *   SYNOPSIS
176cdf0e10cSrcweir  *  clearUp( );
177cdf0e10cSrcweir  *
178cdf0e10cSrcweir  *   FUNCTION
179cdf0e10cSrcweir  *  cleaning resources up includes:
180cdf0e10cSrcweir  *  1. releases the ElementCollector for the signature template element;
181cdf0e10cSrcweir  *  2. releases ElementCollectors for referenced elements;
182cdf0e10cSrcweir  *  3. releases the ElementCollector for the key element, if there is one.
183cdf0e10cSrcweir  *
184cdf0e10cSrcweir  *   INPUTS
185cdf0e10cSrcweir  *  empty
186cdf0e10cSrcweir  *
187cdf0e10cSrcweir  *   RESULT
188cdf0e10cSrcweir  *  empty
189cdf0e10cSrcweir  *
190cdf0e10cSrcweir  *   HISTORY
191cdf0e10cSrcweir  *  05.01.2004 -    implemented
192cdf0e10cSrcweir  *
193cdf0e10cSrcweir  *   AUTHOR
194cdf0e10cSrcweir  *  Michael Mi
195cdf0e10cSrcweir  *  Email: michael.mi@sun.com
196cdf0e10cSrcweir  ******************************************************************************/
197cdf0e10cSrcweir {
198cdf0e10cSrcweir     cssu::Reference < cssxc::sax::XReferenceResolvedBroadcaster >
199cdf0e10cSrcweir         xReferenceResolvedBroadcaster( m_xSAXEventKeeper, cssu::UNO_QUERY );
200cdf0e10cSrcweir     xReferenceResolvedBroadcaster->removeReferenceResolvedListener(
201cdf0e10cSrcweir         m_nIdOfTemplateEC,
202cdf0e10cSrcweir         (const cssu::Reference < cssxc::sax::XReferenceResolvedListener >)((SecurityEngine *)this));
203cdf0e10cSrcweir 
204cdf0e10cSrcweir     m_xSAXEventKeeper->removeElementCollector(m_nIdOfTemplateEC);
205cdf0e10cSrcweir 
206cdf0e10cSrcweir     std::vector< sal_Int32 >::const_iterator ii = m_vReferenceIds.begin();
207cdf0e10cSrcweir 
208cdf0e10cSrcweir     for( ; ii != m_vReferenceIds.end() ; ++ii )
209cdf0e10cSrcweir     {
210cdf0e10cSrcweir         xReferenceResolvedBroadcaster->removeReferenceResolvedListener(
211cdf0e10cSrcweir             *ii,
212cdf0e10cSrcweir             (const cssu::Reference < cssxc::sax::XReferenceResolvedListener >)((SecurityEngine *)this));
213cdf0e10cSrcweir         m_xSAXEventKeeper->removeElementCollector(*ii);
214cdf0e10cSrcweir     }
215cdf0e10cSrcweir 
216cdf0e10cSrcweir     if (m_nIdOfKeyEC != 0 && m_nIdOfKeyEC != -1)
217cdf0e10cSrcweir     {
218cdf0e10cSrcweir         m_xSAXEventKeeper->removeElementCollector(m_nIdOfKeyEC);
219cdf0e10cSrcweir     }
220cdf0e10cSrcweir }
221cdf0e10cSrcweir 
222cdf0e10cSrcweir /* XReferenceCollector */
setReferenceCount(sal_Int32 count)223cdf0e10cSrcweir void SAL_CALL SignatureEngine::setReferenceCount( sal_Int32 count )
224cdf0e10cSrcweir     throw (cssu::Exception, cssu::RuntimeException)
225cdf0e10cSrcweir {
226cdf0e10cSrcweir     m_nTotalReferenceNumber = count;
227cdf0e10cSrcweir     tryToPerform();
228cdf0e10cSrcweir }
229cdf0e10cSrcweir 
setReferenceId(sal_Int32 id)230cdf0e10cSrcweir void SAL_CALL SignatureEngine::setReferenceId( sal_Int32 id )
231cdf0e10cSrcweir     throw (cssu::Exception, cssu::RuntimeException)
232cdf0e10cSrcweir {
233cdf0e10cSrcweir     m_vReferenceIds.push_back( id );
234cdf0e10cSrcweir }
235cdf0e10cSrcweir 
236cdf0e10cSrcweir /* XUriBinding */
setUriBinding(const rtl::OUString & uri,const cssu::Reference<com::sun::star::io::XInputStream> & aInputStream)237cdf0e10cSrcweir void SAL_CALL SignatureEngine::setUriBinding(
238cdf0e10cSrcweir     const rtl::OUString& uri,
239cdf0e10cSrcweir     const cssu::Reference< com::sun::star::io::XInputStream >& aInputStream )
240cdf0e10cSrcweir     throw (cssu::Exception, cssu::RuntimeException)
241cdf0e10cSrcweir {
242cdf0e10cSrcweir     m_vUris.push_back(uri);
243cdf0e10cSrcweir     m_vXInputStreams.push_back(aInputStream);
244cdf0e10cSrcweir }
245cdf0e10cSrcweir 
getUriBinding(const rtl::OUString & uri)246cdf0e10cSrcweir cssu::Reference< com::sun::star::io::XInputStream > SAL_CALL SignatureEngine::getUriBinding( const rtl::OUString& uri )
247cdf0e10cSrcweir     throw (cssu::Exception, cssu::RuntimeException)
248cdf0e10cSrcweir {
249cdf0e10cSrcweir     cssu::Reference< com::sun::star::io::XInputStream > xInputStream;
250cdf0e10cSrcweir 
251cdf0e10cSrcweir     int size = m_vUris.size();
252cdf0e10cSrcweir 
253cdf0e10cSrcweir     for( int i=0; i<size; ++i)
254cdf0e10cSrcweir     {
255cdf0e10cSrcweir         if (m_vUris[i] == uri)
256cdf0e10cSrcweir         {
257cdf0e10cSrcweir             xInputStream = m_vXInputStreams[i];
258cdf0e10cSrcweir             break;
259cdf0e10cSrcweir         }
260cdf0e10cSrcweir     }
261cdf0e10cSrcweir 
262cdf0e10cSrcweir     return xInputStream;
263cdf0e10cSrcweir }
264