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 "decryptorimpl.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 SERVICE_NAME "com.sun.star.xml.crypto.sax.Decryptor"
38cdf0e10cSrcweir #define IMPLEMENTATION_NAME "com.sun.star.xml.security.framework.DecryptorImpl"
39cdf0e10cSrcweir 
40cdf0e10cSrcweir #define	DECLARE_ASCII( SASCIIVALUE )																			\
41cdf0e10cSrcweir 	rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( SASCIIVALUE ) )
42cdf0e10cSrcweir 
DecryptorImpl(const cssu::Reference<cssl::XMultiServiceFactory> & rxMSF)43cdf0e10cSrcweir DecryptorImpl::DecryptorImpl( const cssu::Reference< cssl::XMultiServiceFactory >& rxMSF)
44cdf0e10cSrcweir {
45cdf0e10cSrcweir 	mxMSF = rxMSF;
46cdf0e10cSrcweir }
47cdf0e10cSrcweir 
~DecryptorImpl()48cdf0e10cSrcweir DecryptorImpl::~DecryptorImpl()
49cdf0e10cSrcweir {
50cdf0e10cSrcweir }
51cdf0e10cSrcweir 
checkReady() const52cdf0e10cSrcweir bool DecryptorImpl::checkReady() const
53cdf0e10cSrcweir /****** DecryptorImpl/checkReady *********************************************
54cdf0e10cSrcweir  *
55cdf0e10cSrcweir  *   NAME
56cdf0e10cSrcweir  *	checkReady -- checks the conditions for the decryption.
57cdf0e10cSrcweir  *
58cdf0e10cSrcweir  *   SYNOPSIS
59cdf0e10cSrcweir  *	bReady = checkReady( );
60cdf0e10cSrcweir  *
61cdf0e10cSrcweir  *   FUNCTION
62cdf0e10cSrcweir  *	checks whether all following conditions are satisfied:
63cdf0e10cSrcweir  *	1. the result listener is ready;
64cdf0e10cSrcweir  *	2. the EncryptionEngine is ready.
65cdf0e10cSrcweir  *
66cdf0e10cSrcweir  *   INPUTS
67cdf0e10cSrcweir  *	empty
68cdf0e10cSrcweir  *
69cdf0e10cSrcweir  *   RESULT
70cdf0e10cSrcweir  *	bReady - true if all conditions are satisfied, false otherwise
71cdf0e10cSrcweir  *
72cdf0e10cSrcweir  *   HISTORY
73cdf0e10cSrcweir  *	05.01.2004 -	implemented
74cdf0e10cSrcweir  *
75cdf0e10cSrcweir  *   AUTHOR
76cdf0e10cSrcweir  *	Michael Mi
77cdf0e10cSrcweir  *	Email: michael.mi@sun.com
78cdf0e10cSrcweir  ******************************************************************************/
79cdf0e10cSrcweir {
80cdf0e10cSrcweir 	return (m_xResultListener.is() && EncryptionEngine::checkReady());
81cdf0e10cSrcweir }
82cdf0e10cSrcweir 
notifyResultListener() const83cdf0e10cSrcweir void DecryptorImpl::notifyResultListener() const
84cdf0e10cSrcweir 	throw (cssu::Exception, cssu::RuntimeException)
85cdf0e10cSrcweir /****** DecryptorImpl/notifyResultListener ***********************************
86cdf0e10cSrcweir  *
87cdf0e10cSrcweir  *   NAME
88cdf0e10cSrcweir  *	notifyResultListener -- notifies the listener about the decryption
89cdf0e10cSrcweir  *	result.
90cdf0e10cSrcweir  *
91cdf0e10cSrcweir  *   SYNOPSIS
92cdf0e10cSrcweir  *	notifyResultListener( );
93cdf0e10cSrcweir  *
94cdf0e10cSrcweir  *   FUNCTION
95cdf0e10cSrcweir  *	see NAME.
96cdf0e10cSrcweir  *
97cdf0e10cSrcweir  *   INPUTS
98cdf0e10cSrcweir  *	empty
99cdf0e10cSrcweir  *
100cdf0e10cSrcweir  *   RESULT
101cdf0e10cSrcweir  *	empty
102cdf0e10cSrcweir  *
103cdf0e10cSrcweir  *   HISTORY
104cdf0e10cSrcweir  *	05.01.2004 -	implemented
105cdf0e10cSrcweir  *
106cdf0e10cSrcweir  *   AUTHOR
107cdf0e10cSrcweir  *	Michael Mi
108cdf0e10cSrcweir  *	Email: michael.mi@sun.com
109cdf0e10cSrcweir  ******************************************************************************/
110cdf0e10cSrcweir {
111cdf0e10cSrcweir 	cssu::Reference< cssxc::sax::XDecryptionResultListener >
112cdf0e10cSrcweir 		xDecryptionResultListener ( m_xResultListener , cssu::UNO_QUERY ) ;
113cdf0e10cSrcweir 
114cdf0e10cSrcweir 	xDecryptionResultListener->decrypted(m_nSecurityId,m_nStatus);
115cdf0e10cSrcweir }
116cdf0e10cSrcweir 
startEngine(const cssu::Reference<cssxc::XXMLEncryptionTemplate> & xEncryptionTemplate)117cdf0e10cSrcweir void DecryptorImpl::startEngine( const cssu::Reference<
118cdf0e10cSrcweir 	cssxc::XXMLEncryptionTemplate >&
119cdf0e10cSrcweir 	xEncryptionTemplate)
120cdf0e10cSrcweir 	throw (cssu::Exception, cssu::RuntimeException)
121cdf0e10cSrcweir /****** DecryptorImpl/startEngine ********************************************
122cdf0e10cSrcweir  *
123cdf0e10cSrcweir  *   NAME
124cdf0e10cSrcweir  *	startEngine -- decrypts the encryption.
125cdf0e10cSrcweir  *
126cdf0e10cSrcweir  *   SYNOPSIS
127cdf0e10cSrcweir  *	startEngine( xEncryptionTemplate );
128cdf0e10cSrcweir  *
129cdf0e10cSrcweir  *   FUNCTION
130cdf0e10cSrcweir  *	decrypts the encryption element, then if succeeds, updates the link
131cdf0e10cSrcweir  *	of old template element to the new encryption element in
132cdf0e10cSrcweir  *	SAXEventKeeper.
133cdf0e10cSrcweir  *
134cdf0e10cSrcweir  *   INPUTS
135cdf0e10cSrcweir  *	xEncryptionTemplate - the encryption template to be decrypted.
136cdf0e10cSrcweir  *
137cdf0e10cSrcweir  *   RESULT
138cdf0e10cSrcweir  *	empty
139cdf0e10cSrcweir  *
140cdf0e10cSrcweir  *   HISTORY
141cdf0e10cSrcweir  *	05.01.2004 -	implemented
142cdf0e10cSrcweir  *
143cdf0e10cSrcweir  *   AUTHOR
144cdf0e10cSrcweir  *	Michael Mi
145cdf0e10cSrcweir  *	Email: michael.mi@sun.com
146cdf0e10cSrcweir  ******************************************************************************/
147cdf0e10cSrcweir {
148cdf0e10cSrcweir 	cssu::Reference< cssxc::XXMLEncryptionTemplate > xResultTemplate;
149cdf0e10cSrcweir 	try
150cdf0e10cSrcweir 	{
151cdf0e10cSrcweir 		xResultTemplate = m_xXMLEncryption->decrypt(xEncryptionTemplate, m_xXMLSecurityContext);
152cdf0e10cSrcweir 		m_nStatus = xResultTemplate->getStatus();
153cdf0e10cSrcweir 	}
154cdf0e10cSrcweir 	catch( cssu::Exception& )
155cdf0e10cSrcweir 	{
156cdf0e10cSrcweir 		m_nStatus = cssxc::SecurityOperationStatus_RUNTIMEERROR_FAILED;
157cdf0e10cSrcweir 	}
158cdf0e10cSrcweir 
159cdf0e10cSrcweir 	if (m_nStatus == cssxc::SecurityOperationStatus_OPERATION_SUCCEEDED)
160cdf0e10cSrcweir 	{
161cdf0e10cSrcweir 		cssu::Reference< cssxw::XXMLElementWrapper > xDecryptedElement
162cdf0e10cSrcweir 			= xResultTemplate->getTemplate();
163cdf0e10cSrcweir 		m_xSAXEventKeeper->setElement(m_nIdOfTemplateEC, xDecryptedElement);
164cdf0e10cSrcweir 	}
165cdf0e10cSrcweir }
166cdf0e10cSrcweir 
167cdf0e10cSrcweir /* XDecryptionResultBroadcaster */
addDecryptionResultListener(const cssu::Reference<cssxc::sax::XDecryptionResultListener> & listener)168cdf0e10cSrcweir void SAL_CALL DecryptorImpl::addDecryptionResultListener( const cssu::Reference< cssxc::sax::XDecryptionResultListener >& listener )
169cdf0e10cSrcweir     	throw (cssu::Exception, cssu::RuntimeException)
170cdf0e10cSrcweir {
171cdf0e10cSrcweir 	m_xResultListener = listener;
172cdf0e10cSrcweir 	tryToPerform();
173cdf0e10cSrcweir }
174cdf0e10cSrcweir 
removeDecryptionResultListener(const cssu::Reference<cssxc::sax::XDecryptionResultListener> &)175cdf0e10cSrcweir void SAL_CALL DecryptorImpl::removeDecryptionResultListener( const cssu::Reference< cssxc::sax::XDecryptionResultListener >&)
176cdf0e10cSrcweir     	throw (cssu::RuntimeException)
177cdf0e10cSrcweir {
178cdf0e10cSrcweir }
179cdf0e10cSrcweir 
180cdf0e10cSrcweir /* XInitialization */
initialize(const cssu::Sequence<cssu::Any> & aArguments)181cdf0e10cSrcweir void SAL_CALL DecryptorImpl::initialize( const cssu::Sequence< cssu::Any >& aArguments )
182cdf0e10cSrcweir 	throw (cssu::Exception, cssu::RuntimeException)
183cdf0e10cSrcweir {
184cdf0e10cSrcweir 	OSL_ASSERT(aArguments.getLength() == 5);
185cdf0e10cSrcweir 
186cdf0e10cSrcweir 	rtl::OUString ouTempString;
187cdf0e10cSrcweir 
188cdf0e10cSrcweir 	aArguments[0] >>= ouTempString;
189cdf0e10cSrcweir 	m_nSecurityId = ouTempString.toInt32();
190cdf0e10cSrcweir 	aArguments[1] >>= m_xSAXEventKeeper;
191cdf0e10cSrcweir 	aArguments[2] >>= ouTempString;
192cdf0e10cSrcweir 	m_nIdOfTemplateEC = ouTempString.toInt32();
193cdf0e10cSrcweir 	aArguments[3] >>= m_xXMLSecurityContext;
194cdf0e10cSrcweir 	aArguments[4] >>= m_xXMLEncryption;
195cdf0e10cSrcweir }
196cdf0e10cSrcweir 
DecryptorImpl_getImplementationName()197cdf0e10cSrcweir rtl::OUString DecryptorImpl_getImplementationName ()
198cdf0e10cSrcweir 	throw (cssu::RuntimeException)
199cdf0e10cSrcweir {
200cdf0e10cSrcweir 	return rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM ( IMPLEMENTATION_NAME ) );
201cdf0e10cSrcweir }
202cdf0e10cSrcweir 
DecryptorImpl_supportsService(const rtl::OUString & ServiceName)203cdf0e10cSrcweir sal_Bool SAL_CALL DecryptorImpl_supportsService( const rtl::OUString& ServiceName )
204cdf0e10cSrcweir 	throw (cssu::RuntimeException)
205cdf0e10cSrcweir {
206cdf0e10cSrcweir 	return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( SERVICE_NAME ));
207cdf0e10cSrcweir }
208cdf0e10cSrcweir 
DecryptorImpl_getSupportedServiceNames()209cdf0e10cSrcweir cssu::Sequence< rtl::OUString > SAL_CALL DecryptorImpl_getSupportedServiceNames(  )
210cdf0e10cSrcweir 	throw (cssu::RuntimeException)
211cdf0e10cSrcweir {
212cdf0e10cSrcweir 	cssu::Sequence < rtl::OUString > aRet(1);
213cdf0e10cSrcweir 	rtl::OUString* pArray = aRet.getArray();
214cdf0e10cSrcweir 	pArray[0] =  rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM ( SERVICE_NAME ) );
215cdf0e10cSrcweir 	return aRet;
216cdf0e10cSrcweir }
217cdf0e10cSrcweir #undef SERVICE_NAME
218cdf0e10cSrcweir 
DecryptorImpl_createInstance(const cssu::Reference<cssl::XMultiServiceFactory> & rSMgr)219cdf0e10cSrcweir cssu::Reference< cssu::XInterface > SAL_CALL DecryptorImpl_createInstance( const cssu::Reference< cssl::XMultiServiceFactory >& rSMgr)
220cdf0e10cSrcweir 	throw( cssu::Exception )
221cdf0e10cSrcweir {
222cdf0e10cSrcweir 	return (cppu::OWeakObject*) new DecryptorImpl(rSMgr);
223cdf0e10cSrcweir }
224cdf0e10cSrcweir 
225cdf0e10cSrcweir /* XServiceInfo */
getImplementationName()226cdf0e10cSrcweir rtl::OUString SAL_CALL DecryptorImpl::getImplementationName(  )
227cdf0e10cSrcweir 	throw (cssu::RuntimeException)
228cdf0e10cSrcweir {
229cdf0e10cSrcweir 	return DecryptorImpl_getImplementationName();
230cdf0e10cSrcweir }
supportsService(const rtl::OUString & rServiceName)231cdf0e10cSrcweir sal_Bool SAL_CALL DecryptorImpl::supportsService( const rtl::OUString& rServiceName )
232cdf0e10cSrcweir 	throw (cssu::RuntimeException)
233cdf0e10cSrcweir {
234cdf0e10cSrcweir 	return DecryptorImpl_supportsService( rServiceName );
235cdf0e10cSrcweir }
getSupportedServiceNames()236cdf0e10cSrcweir cssu::Sequence< rtl::OUString > SAL_CALL DecryptorImpl::getSupportedServiceNames(  )
237cdf0e10cSrcweir 	throw (cssu::RuntimeException)
238cdf0e10cSrcweir {
239cdf0e10cSrcweir 	return DecryptorImpl_getSupportedServiceNames();
240cdf0e10cSrcweir }
241cdf0e10cSrcweir 
242