1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_xmlsecurity.hxx"
26 
27 #include "decryptorimpl.hxx"
28 #include <com/sun/star/xml/crypto/XXMLEncryptionTemplate.hpp>
29 #include <com/sun/star/xml/wrapper/XXMLElementWrapper.hpp>
30 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
31 
32 namespace cssu = com::sun::star::uno;
33 namespace cssl = com::sun::star::lang;
34 namespace cssxc = com::sun::star::xml::crypto;
35 namespace cssxw = com::sun::star::xml::wrapper;
36 
37 #define SERVICE_NAME "com.sun.star.xml.crypto.sax.Decryptor"
38 #define IMPLEMENTATION_NAME "com.sun.star.xml.security.framework.DecryptorImpl"
39 
40 #define	DECLARE_ASCII( SASCIIVALUE )																			\
41 	rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( SASCIIVALUE ) )
42 
DecryptorImpl(const cssu::Reference<cssl::XMultiServiceFactory> & rxMSF)43 DecryptorImpl::DecryptorImpl( const cssu::Reference< cssl::XMultiServiceFactory >& rxMSF)
44 {
45 	mxMSF = rxMSF;
46 }
47 
~DecryptorImpl()48 DecryptorImpl::~DecryptorImpl()
49 {
50 }
51 
checkReady() const52 bool DecryptorImpl::checkReady() const
53 /****** DecryptorImpl/checkReady *********************************************
54  *
55  *   NAME
56  *	checkReady -- checks the conditions for the decryption.
57  *
58  *   SYNOPSIS
59  *	bReady = checkReady( );
60  *
61  *   FUNCTION
62  *	checks whether all following conditions are satisfied:
63  *	1. the result listener is ready;
64  *	2. the EncryptionEngine is ready.
65  *
66  *   INPUTS
67  *	empty
68  *
69  *   RESULT
70  *	bReady - true if all conditions are satisfied, false otherwise
71  *
72  *   HISTORY
73  *	05.01.2004 -	implemented
74  *
75  *   AUTHOR
76  *	Michael Mi
77  *	Email: michael.mi@sun.com
78  ******************************************************************************/
79 {
80 	return (m_xResultListener.is() && EncryptionEngine::checkReady());
81 }
82 
notifyResultListener() const83 void DecryptorImpl::notifyResultListener() const
84 	throw (cssu::Exception, cssu::RuntimeException)
85 /****** DecryptorImpl/notifyResultListener ***********************************
86  *
87  *   NAME
88  *	notifyResultListener -- notifies the listener about the decryption
89  *	result.
90  *
91  *   SYNOPSIS
92  *	notifyResultListener( );
93  *
94  *   FUNCTION
95  *	see NAME.
96  *
97  *   INPUTS
98  *	empty
99  *
100  *   RESULT
101  *	empty
102  *
103  *   HISTORY
104  *	05.01.2004 -	implemented
105  *
106  *   AUTHOR
107  *	Michael Mi
108  *	Email: michael.mi@sun.com
109  ******************************************************************************/
110 {
111 	cssu::Reference< cssxc::sax::XDecryptionResultListener >
112 		xDecryptionResultListener ( m_xResultListener , cssu::UNO_QUERY ) ;
113 
114 	xDecryptionResultListener->decrypted(m_nSecurityId,m_nStatus);
115 }
116 
startEngine(const cssu::Reference<cssxc::XXMLEncryptionTemplate> & xEncryptionTemplate)117 void DecryptorImpl::startEngine( const cssu::Reference<
118 	cssxc::XXMLEncryptionTemplate >&
119 	xEncryptionTemplate)
120 	throw (cssu::Exception, cssu::RuntimeException)
121 /****** DecryptorImpl/startEngine ********************************************
122  *
123  *   NAME
124  *	startEngine -- decrypts the encryption.
125  *
126  *   SYNOPSIS
127  *	startEngine( xEncryptionTemplate );
128  *
129  *   FUNCTION
130  *	decrypts the encryption element, then if succeeds, updates the link
131  *	of old template element to the new encryption element in
132  *	SAXEventKeeper.
133  *
134  *   INPUTS
135  *	xEncryptionTemplate - the encryption template to be decrypted.
136  *
137  *   RESULT
138  *	empty
139  *
140  *   HISTORY
141  *	05.01.2004 -	implemented
142  *
143  *   AUTHOR
144  *	Michael Mi
145  *	Email: michael.mi@sun.com
146  ******************************************************************************/
147 {
148 	cssu::Reference< cssxc::XXMLEncryptionTemplate > xResultTemplate;
149 	try
150 	{
151 		xResultTemplate = m_xXMLEncryption->decrypt(xEncryptionTemplate, m_xXMLSecurityContext);
152 		m_nStatus = xResultTemplate->getStatus();
153 	}
154 	catch( cssu::Exception& )
155 	{
156 		m_nStatus = cssxc::SecurityOperationStatus_RUNTIMEERROR_FAILED;
157 	}
158 
159 	if (m_nStatus == cssxc::SecurityOperationStatus_OPERATION_SUCCEEDED)
160 	{
161 		cssu::Reference< cssxw::XXMLElementWrapper > xDecryptedElement
162 			= xResultTemplate->getTemplate();
163 		m_xSAXEventKeeper->setElement(m_nIdOfTemplateEC, xDecryptedElement);
164 	}
165 }
166 
167 /* XDecryptionResultBroadcaster */
addDecryptionResultListener(const cssu::Reference<cssxc::sax::XDecryptionResultListener> & listener)168 void SAL_CALL DecryptorImpl::addDecryptionResultListener( const cssu::Reference< cssxc::sax::XDecryptionResultListener >& listener )
169     	throw (cssu::Exception, cssu::RuntimeException)
170 {
171 	m_xResultListener = listener;
172 	tryToPerform();
173 }
174 
removeDecryptionResultListener(const cssu::Reference<cssxc::sax::XDecryptionResultListener> &)175 void SAL_CALL DecryptorImpl::removeDecryptionResultListener( const cssu::Reference< cssxc::sax::XDecryptionResultListener >&)
176     	throw (cssu::RuntimeException)
177 {
178 }
179 
180 /* XInitialization */
initialize(const cssu::Sequence<cssu::Any> & aArguments)181 void SAL_CALL DecryptorImpl::initialize( const cssu::Sequence< cssu::Any >& aArguments )
182 	throw (cssu::Exception, cssu::RuntimeException)
183 {
184 	OSL_ASSERT(aArguments.getLength() == 5);
185 
186 	rtl::OUString ouTempString;
187 
188 	aArguments[0] >>= ouTempString;
189 	m_nSecurityId = ouTempString.toInt32();
190 	aArguments[1] >>= m_xSAXEventKeeper;
191 	aArguments[2] >>= ouTempString;
192 	m_nIdOfTemplateEC = ouTempString.toInt32();
193 	aArguments[3] >>= m_xXMLSecurityContext;
194 	aArguments[4] >>= m_xXMLEncryption;
195 }
196 
DecryptorImpl_getImplementationName()197 rtl::OUString DecryptorImpl_getImplementationName ()
198 	throw (cssu::RuntimeException)
199 {
200 	return rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM ( IMPLEMENTATION_NAME ) );
201 }
202 
DecryptorImpl_supportsService(const rtl::OUString & ServiceName)203 sal_Bool SAL_CALL DecryptorImpl_supportsService( const rtl::OUString& ServiceName )
204 	throw (cssu::RuntimeException)
205 {
206 	return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( SERVICE_NAME ));
207 }
208 
DecryptorImpl_getSupportedServiceNames()209 cssu::Sequence< rtl::OUString > SAL_CALL DecryptorImpl_getSupportedServiceNames(  )
210 	throw (cssu::RuntimeException)
211 {
212 	cssu::Sequence < rtl::OUString > aRet(1);
213 	rtl::OUString* pArray = aRet.getArray();
214 	pArray[0] =  rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM ( SERVICE_NAME ) );
215 	return aRet;
216 }
217 #undef SERVICE_NAME
218 
DecryptorImpl_createInstance(const cssu::Reference<cssl::XMultiServiceFactory> & rSMgr)219 cssu::Reference< cssu::XInterface > SAL_CALL DecryptorImpl_createInstance( const cssu::Reference< cssl::XMultiServiceFactory >& rSMgr)
220 	throw( cssu::Exception )
221 {
222 	return (cppu::OWeakObject*) new DecryptorImpl(rSMgr);
223 }
224 
225 /* XServiceInfo */
getImplementationName()226 rtl::OUString SAL_CALL DecryptorImpl::getImplementationName(  )
227 	throw (cssu::RuntimeException)
228 {
229 	return DecryptorImpl_getImplementationName();
230 }
supportsService(const rtl::OUString & rServiceName)231 sal_Bool SAL_CALL DecryptorImpl::supportsService( const rtl::OUString& rServiceName )
232 	throw (cssu::RuntimeException)
233 {
234 	return DecryptorImpl_supportsService( rServiceName );
235 }
getSupportedServiceNames()236 cssu::Sequence< rtl::OUString > SAL_CALL DecryptorImpl::getSupportedServiceNames(  )
237 	throw (cssu::RuntimeException)
238 {
239 	return DecryptorImpl_getSupportedServiceNames();
240 }
241 
242