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
10*06b3ce53SAndrew Rist *
11*06b3ce53SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*06b3ce53SAndrew Rist *
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.
19*06b3ce53SAndrew Rist *
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 "encryptionengine.hxx"
28cdf0e10cSrcweir #include <com/sun/star/xml/crypto/XXMLEncryptionTemplate.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 ENCRYPTION_TEMPLATE "com.sun.star.xml.crypto.XMLEncryptionTemplate"
38cdf0e10cSrcweir
39cdf0e10cSrcweir #define DECLARE_ASCII( SASCIIVALUE ) \
40cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( SASCIIVALUE ) )
41cdf0e10cSrcweir
EncryptionEngine()42cdf0e10cSrcweir EncryptionEngine::EncryptionEngine( )
43cdf0e10cSrcweir :m_nIdOfBlocker(-1)
44cdf0e10cSrcweir {
45cdf0e10cSrcweir }
46cdf0e10cSrcweir
checkReady() const47cdf0e10cSrcweir bool EncryptionEngine::checkReady() const
48cdf0e10cSrcweir /****** EncryptionEngine/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 id of the template blocker is known;
61cdf0e10cSrcweir * 4. both the key element and the encryption template
62cdf0e10cSrcweir * 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_nIdOfBlocker == -1 ||
89cdf0e10cSrcweir 1+nKeyInc > m_nNumOfResolvedReferences )
90cdf0e10cSrcweir {
91cdf0e10cSrcweir rc = false;
92cdf0e10cSrcweir }
93cdf0e10cSrcweir
94cdf0e10cSrcweir return rc;
95cdf0e10cSrcweir }
96cdf0e10cSrcweir
tryToPerform()97cdf0e10cSrcweir void EncryptionEngine::tryToPerform( )
98cdf0e10cSrcweir throw (cssu::Exception, cssu::RuntimeException)
99cdf0e10cSrcweir /****** EncryptionEngine/tryToPerform ****************************************
100cdf0e10cSrcweir *
101cdf0e10cSrcweir * NAME
102cdf0e10cSrcweir * tryToPerform -- tries to perform the encryption/decryption operation.
103cdf0e10cSrcweir *
104cdf0e10cSrcweir * SYNOPSIS
105cdf0e10cSrcweir * tryToPerform( );
106cdf0e10cSrcweir *
107cdf0e10cSrcweir * FUNCTION
108cdf0e10cSrcweir * if the situation is ready, perform following operations.
109cdf0e10cSrcweir * 1. prepares a encryption template;
110cdf0e10cSrcweir * 2. calls the encryption 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 sEncryptionTemplate (
132cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( ENCRYPTION_TEMPLATE ) );
133cdf0e10cSrcweir cssu::Reference < cssxc::XXMLEncryptionTemplate > xEncryptionTemplate(
134cdf0e10cSrcweir mxMSF->createInstance( sEncryptionTemplate ), cssu::UNO_QUERY );
135cdf0e10cSrcweir
136cdf0e10cSrcweir OSL_ASSERT( xEncryptionTemplate.is() );
137cdf0e10cSrcweir
138cdf0e10cSrcweir cssu::Reference< cssxw::XXMLElementWrapper > xXMLElement
139cdf0e10cSrcweir = m_xSAXEventKeeper->getElement( m_nIdOfTemplateEC );
140cdf0e10cSrcweir
141cdf0e10cSrcweir xEncryptionTemplate->setTemplate(xXMLElement);
142cdf0e10cSrcweir
143cdf0e10cSrcweir startEngine( xEncryptionTemplate );
144cdf0e10cSrcweir
145cdf0e10cSrcweir /*
146cdf0e10cSrcweir * done
147cdf0e10cSrcweir */
148cdf0e10cSrcweir clearUp( );
149cdf0e10cSrcweir
150cdf0e10cSrcweir notifyResultListener();
151cdf0e10cSrcweir
152cdf0e10cSrcweir m_bMissionDone = true;
153cdf0e10cSrcweir }
154cdf0e10cSrcweir }
155cdf0e10cSrcweir
clearUp() const156cdf0e10cSrcweir void EncryptionEngine::clearUp( ) const
157cdf0e10cSrcweir /****** EncryptionEngine/clearup *********************************************
158cdf0e10cSrcweir *
159cdf0e10cSrcweir * NAME
160cdf0e10cSrcweir * clearUp -- clear up all resources used by this operation.
161cdf0e10cSrcweir *
162cdf0e10cSrcweir * SYNOPSIS
163cdf0e10cSrcweir * clearUp( );
164cdf0e10cSrcweir *
165cdf0e10cSrcweir * FUNCTION
166cdf0e10cSrcweir * cleaning resources up includes:
167cdf0e10cSrcweir * 1. releases the ElementCollector for the encryption template element;
168cdf0e10cSrcweir * 2. releases the Blocker for the encryption template element;
169cdf0e10cSrcweir * 3. releases the ElementCollector for the key element, if there is one.
170cdf0e10cSrcweir *
171cdf0e10cSrcweir * INPUTS
172cdf0e10cSrcweir * empty
173cdf0e10cSrcweir *
174cdf0e10cSrcweir * RESULT
175cdf0e10cSrcweir * empty
176cdf0e10cSrcweir *
177cdf0e10cSrcweir * HISTORY
178cdf0e10cSrcweir * 05.01.2004 - implemented
179cdf0e10cSrcweir *
180cdf0e10cSrcweir * AUTHOR
181cdf0e10cSrcweir * Michael Mi
182cdf0e10cSrcweir * Email: michael.mi@sun.com
183cdf0e10cSrcweir ******************************************************************************/
184cdf0e10cSrcweir {
185cdf0e10cSrcweir cssu::Reference < cssxc::sax::XReferenceResolvedBroadcaster >
186cdf0e10cSrcweir xReferenceResolvedBroadcaster( m_xSAXEventKeeper, cssu::UNO_QUERY );
187cdf0e10cSrcweir
188cdf0e10cSrcweir xReferenceResolvedBroadcaster->removeReferenceResolvedListener(
189cdf0e10cSrcweir m_nIdOfTemplateEC,
190cdf0e10cSrcweir (const cssu::Reference < cssxc::sax::XReferenceResolvedListener >)((SecurityEngine *)this));
191cdf0e10cSrcweir
192cdf0e10cSrcweir m_xSAXEventKeeper->removeElementCollector(m_nIdOfTemplateEC);
193cdf0e10cSrcweir
194cdf0e10cSrcweir if (m_nIdOfBlocker != -1)
195cdf0e10cSrcweir {
196cdf0e10cSrcweir m_xSAXEventKeeper->removeBlocker(m_nIdOfBlocker);
197cdf0e10cSrcweir }
198cdf0e10cSrcweir
199cdf0e10cSrcweir if (m_nIdOfKeyEC != 0 && m_nIdOfKeyEC != -1)
200cdf0e10cSrcweir {
201cdf0e10cSrcweir m_xSAXEventKeeper->removeElementCollector(m_nIdOfKeyEC);
202cdf0e10cSrcweir }
203cdf0e10cSrcweir }
204cdf0e10cSrcweir
205cdf0e10cSrcweir /* XBlockerMonitor */
setBlockerId(sal_Int32 id)206cdf0e10cSrcweir void SAL_CALL EncryptionEngine::setBlockerId( sal_Int32 id )
207cdf0e10cSrcweir throw (com::sun::star::uno::Exception, com::sun::star::uno::RuntimeException)
208cdf0e10cSrcweir {
209cdf0e10cSrcweir m_nIdOfBlocker = id;
210cdf0e10cSrcweir tryToPerform();
211cdf0e10cSrcweir }
212cdf0e10cSrcweir
213