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 "encryptorimpl.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.Encryptor"
38cdf0e10cSrcweir #define IMPLEMENTATION_NAME "com.sun.star.xml.security.framework.EncryptorImpl"
39cdf0e10cSrcweir
40cdf0e10cSrcweir #define DECLARE_ASCII( SASCIIVALUE ) \
41cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( SASCIIVALUE ) )
42cdf0e10cSrcweir
EncryptorImpl(const cssu::Reference<cssl::XMultiServiceFactory> & rxMSF)43cdf0e10cSrcweir EncryptorImpl::EncryptorImpl( const cssu::Reference< cssl::XMultiServiceFactory >& rxMSF)
44cdf0e10cSrcweir {
45cdf0e10cSrcweir m_nReferenceId = -1;
46cdf0e10cSrcweir mxMSF = rxMSF;
47cdf0e10cSrcweir }
48cdf0e10cSrcweir
~EncryptorImpl()49cdf0e10cSrcweir EncryptorImpl::~EncryptorImpl()
50cdf0e10cSrcweir {
51cdf0e10cSrcweir }
52cdf0e10cSrcweir
checkReady() const53cdf0e10cSrcweir bool EncryptorImpl::checkReady() const
54cdf0e10cSrcweir /****** EncryptorImpl/checkReady *********************************************
55cdf0e10cSrcweir *
56cdf0e10cSrcweir * NAME
57cdf0e10cSrcweir * checkReady -- checks the conditions for the encryption.
58cdf0e10cSrcweir *
59cdf0e10cSrcweir * SYNOPSIS
60cdf0e10cSrcweir * bReady = checkReady( );
61cdf0e10cSrcweir *
62cdf0e10cSrcweir * FUNCTION
63cdf0e10cSrcweir * checks whether all following conditions are satisfied:
64cdf0e10cSrcweir * 1. the result listener is ready;
65cdf0e10cSrcweir * 2. the EncryptionEngine is ready.
66cdf0e10cSrcweir *
67cdf0e10cSrcweir * INPUTS
68cdf0e10cSrcweir * empty
69cdf0e10cSrcweir *
70cdf0e10cSrcweir * RESULT
71cdf0e10cSrcweir * bReady - true if all conditions are satisfied, false otherwise
72cdf0e10cSrcweir *
73cdf0e10cSrcweir * HISTORY
74cdf0e10cSrcweir * 05.01.2004 - implemented
75cdf0e10cSrcweir *
76cdf0e10cSrcweir * AUTHOR
77cdf0e10cSrcweir * Michael Mi
78cdf0e10cSrcweir * Email: michael.mi@sun.com
79cdf0e10cSrcweir ******************************************************************************/
80cdf0e10cSrcweir {
81cdf0e10cSrcweir sal_Int32 nKeyInc = 0;
82cdf0e10cSrcweir if (m_nIdOfKeyEC != 0)
83cdf0e10cSrcweir {
84cdf0e10cSrcweir nKeyInc = 1;
85cdf0e10cSrcweir }
86cdf0e10cSrcweir
87cdf0e10cSrcweir return (m_xResultListener.is() &&
88cdf0e10cSrcweir (m_nReferenceId != -1) &&
89cdf0e10cSrcweir (2+nKeyInc == m_nNumOfResolvedReferences) &&
90cdf0e10cSrcweir EncryptionEngine::checkReady());
91cdf0e10cSrcweir }
92cdf0e10cSrcweir
notifyResultListener() const93cdf0e10cSrcweir void EncryptorImpl::notifyResultListener() const
94cdf0e10cSrcweir throw (cssu::Exception, cssu::RuntimeException)
95cdf0e10cSrcweir /****** DecryptorImpl/notifyResultListener ***********************************
96cdf0e10cSrcweir *
97cdf0e10cSrcweir * NAME
98cdf0e10cSrcweir * notifyResultListener -- notifies the listener about the encryption
99cdf0e10cSrcweir * result.
100cdf0e10cSrcweir *
101cdf0e10cSrcweir * SYNOPSIS
102cdf0e10cSrcweir * notifyResultListener( );
103cdf0e10cSrcweir *
104cdf0e10cSrcweir * FUNCTION
105cdf0e10cSrcweir * see NAME.
106cdf0e10cSrcweir *
107cdf0e10cSrcweir * INPUTS
108cdf0e10cSrcweir * empty
109cdf0e10cSrcweir *
110cdf0e10cSrcweir * RESULT
111cdf0e10cSrcweir * empty
112cdf0e10cSrcweir *
113cdf0e10cSrcweir * HISTORY
114cdf0e10cSrcweir * 05.01.2004 - implemented
115cdf0e10cSrcweir *
116cdf0e10cSrcweir * AUTHOR
117cdf0e10cSrcweir * Michael Mi
118cdf0e10cSrcweir * Email: michael.mi@sun.com
119cdf0e10cSrcweir ******************************************************************************/
120cdf0e10cSrcweir {
121cdf0e10cSrcweir cssu::Reference< cssxc::sax::XEncryptionResultListener >
122cdf0e10cSrcweir xEncryptionResultListener ( m_xResultListener , cssu::UNO_QUERY ) ;
123cdf0e10cSrcweir
124cdf0e10cSrcweir xEncryptionResultListener->encrypted( m_nSecurityId, m_nStatus );
125cdf0e10cSrcweir }
126cdf0e10cSrcweir
startEngine(const cssu::Reference<cssxc::XXMLEncryptionTemplate> & xEncryptionTemplate)127cdf0e10cSrcweir void EncryptorImpl::startEngine( const cssu::Reference<
128cdf0e10cSrcweir cssxc::XXMLEncryptionTemplate >&
129cdf0e10cSrcweir xEncryptionTemplate)
130cdf0e10cSrcweir throw (cssu::Exception, cssu::RuntimeException)
131cdf0e10cSrcweir /****** EncryptorImpl/startEngine ********************************************
132cdf0e10cSrcweir *
133cdf0e10cSrcweir * NAME
134cdf0e10cSrcweir * startEngine -- generates the encryption.
135cdf0e10cSrcweir *
136cdf0e10cSrcweir * SYNOPSIS
137cdf0e10cSrcweir * startEngine( xEncryptionTemplate );
138cdf0e10cSrcweir *
139cdf0e10cSrcweir * FUNCTION
140cdf0e10cSrcweir * generates the encryption element, then if succeeds, updates the link
141cdf0e10cSrcweir * of old template element to the new encryption element in
142cdf0e10cSrcweir * SAXEventKeeper.
143cdf0e10cSrcweir *
144cdf0e10cSrcweir * INPUTS
145cdf0e10cSrcweir * xEncryptionTemplate - the encryption template to be encrypted.
146cdf0e10cSrcweir *
147cdf0e10cSrcweir * RESULT
148cdf0e10cSrcweir * empty
149cdf0e10cSrcweir *
150cdf0e10cSrcweir * HISTORY
151cdf0e10cSrcweir * 05.01.2004 - implemented
152cdf0e10cSrcweir *
153cdf0e10cSrcweir * AUTHOR
154cdf0e10cSrcweir * Michael Mi
155cdf0e10cSrcweir * Email: michael.mi@sun.com
156cdf0e10cSrcweir ******************************************************************************/
157cdf0e10cSrcweir {
158cdf0e10cSrcweir cssu::Reference < cssxc::XXMLEncryptionTemplate > xResultTemplate;
159cdf0e10cSrcweir
160cdf0e10cSrcweir cssu::Reference< cssxw::XXMLElementWrapper >
161cdf0e10cSrcweir xXMLElement = m_xSAXEventKeeper->getElement( m_nReferenceId );
162cdf0e10cSrcweir xEncryptionTemplate->setTarget(xXMLElement);
163cdf0e10cSrcweir
164cdf0e10cSrcweir try
165cdf0e10cSrcweir {
166cdf0e10cSrcweir xResultTemplate = m_xXMLEncryption->encrypt(
167cdf0e10cSrcweir xEncryptionTemplate, m_xSecurityEnvironment);
168cdf0e10cSrcweir m_nStatus = xResultTemplate->getStatus();
169cdf0e10cSrcweir }
170cdf0e10cSrcweir catch( cssu::Exception& )
171cdf0e10cSrcweir {
172cdf0e10cSrcweir m_nStatus = cssxc::SecurityOperationStatus_RUNTIMEERROR_FAILED;
173cdf0e10cSrcweir }
174cdf0e10cSrcweir
175cdf0e10cSrcweir if (m_nStatus == cssxc::SecurityOperationStatus_OPERATION_SUCCEEDED)
176cdf0e10cSrcweir {
177cdf0e10cSrcweir cssu::Reference < cssxw::XXMLElementWrapper > xResultEncryption
178cdf0e10cSrcweir = xResultTemplate->getTemplate();
179cdf0e10cSrcweir m_xSAXEventKeeper->setElement(m_nIdOfTemplateEC, xResultEncryption);
180cdf0e10cSrcweir m_xSAXEventKeeper->setElement(m_nReferenceId, NULL);
181cdf0e10cSrcweir }
182cdf0e10cSrcweir }
183cdf0e10cSrcweir
184cdf0e10cSrcweir /* XReferenceCollector */
setReferenceCount(sal_Int32)185cdf0e10cSrcweir void SAL_CALL EncryptorImpl::setReferenceCount(sal_Int32)
186cdf0e10cSrcweir throw (cssu::Exception, cssu::RuntimeException)
187cdf0e10cSrcweir {
188cdf0e10cSrcweir /*
189cdf0e10cSrcweir * dummp method, because there is only one reference in
190cdf0e10cSrcweir * encryption, different from signature.
191cdf0e10cSrcweir * so the referenceNumber is always 1
192cdf0e10cSrcweir */
193cdf0e10cSrcweir }
194cdf0e10cSrcweir
setReferenceId(sal_Int32 id)195cdf0e10cSrcweir void SAL_CALL EncryptorImpl::setReferenceId( sal_Int32 id )
196cdf0e10cSrcweir throw (cssu::Exception, cssu::RuntimeException)
197cdf0e10cSrcweir {
198cdf0e10cSrcweir m_nReferenceId = id;
199cdf0e10cSrcweir }
200cdf0e10cSrcweir
201cdf0e10cSrcweir /* XEncryptionResultBroadcaster */
addEncryptionResultListener(const cssu::Reference<cssxc::sax::XEncryptionResultListener> & listener)202cdf0e10cSrcweir void SAL_CALL EncryptorImpl::addEncryptionResultListener( const cssu::Reference< cssxc::sax::XEncryptionResultListener >& listener )
203cdf0e10cSrcweir throw (cssu::Exception, cssu::RuntimeException)
204cdf0e10cSrcweir {
205cdf0e10cSrcweir m_xResultListener = listener;
206cdf0e10cSrcweir tryToPerform();
207cdf0e10cSrcweir }
208cdf0e10cSrcweir
removeEncryptionResultListener(const cssu::Reference<cssxc::sax::XEncryptionResultListener> &)209cdf0e10cSrcweir void SAL_CALL EncryptorImpl::removeEncryptionResultListener( const cssu::Reference< cssxc::sax::XEncryptionResultListener >&)
210cdf0e10cSrcweir throw (cssu::RuntimeException)
211cdf0e10cSrcweir {
212cdf0e10cSrcweir }
213cdf0e10cSrcweir
214cdf0e10cSrcweir /* XInitialization */
initialize(const cssu::Sequence<cssu::Any> & aArguments)215cdf0e10cSrcweir void SAL_CALL EncryptorImpl::initialize( const cssu::Sequence< cssu::Any >& aArguments )
216cdf0e10cSrcweir throw (cssu::Exception, cssu::RuntimeException)
217cdf0e10cSrcweir {
218cdf0e10cSrcweir OSL_ASSERT(aArguments.getLength() == 5);
219cdf0e10cSrcweir
220cdf0e10cSrcweir rtl::OUString ouTempString;
221cdf0e10cSrcweir
222cdf0e10cSrcweir aArguments[0] >>= ouTempString;
223cdf0e10cSrcweir m_nSecurityId = ouTempString.toInt32();
224cdf0e10cSrcweir aArguments[1] >>= m_xSAXEventKeeper;
225cdf0e10cSrcweir aArguments[2] >>= ouTempString;
226cdf0e10cSrcweir m_nIdOfTemplateEC = ouTempString.toInt32();
227cdf0e10cSrcweir aArguments[3] >>= m_xSecurityEnvironment;
228cdf0e10cSrcweir aArguments[4] >>= m_xXMLEncryption;
229cdf0e10cSrcweir }
230cdf0e10cSrcweir
231cdf0e10cSrcweir
EncryptorImpl_getImplementationName()232cdf0e10cSrcweir rtl::OUString EncryptorImpl_getImplementationName ()
233cdf0e10cSrcweir throw (cssu::RuntimeException)
234cdf0e10cSrcweir {
235cdf0e10cSrcweir return rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM ( IMPLEMENTATION_NAME ) );
236cdf0e10cSrcweir }
237cdf0e10cSrcweir
EncryptorImpl_supportsService(const rtl::OUString & ServiceName)238cdf0e10cSrcweir sal_Bool SAL_CALL EncryptorImpl_supportsService( const rtl::OUString& ServiceName )
239cdf0e10cSrcweir throw (cssu::RuntimeException)
240cdf0e10cSrcweir {
241cdf0e10cSrcweir return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( SERVICE_NAME ));
242cdf0e10cSrcweir }
243cdf0e10cSrcweir
EncryptorImpl_getSupportedServiceNames()244cdf0e10cSrcweir cssu::Sequence< rtl::OUString > SAL_CALL EncryptorImpl_getSupportedServiceNames( )
245cdf0e10cSrcweir throw (cssu::RuntimeException)
246cdf0e10cSrcweir {
247cdf0e10cSrcweir cssu::Sequence < rtl::OUString > aRet(1);
248cdf0e10cSrcweir rtl::OUString* pArray = aRet.getArray();
249cdf0e10cSrcweir pArray[0] = rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM ( SERVICE_NAME ) );
250cdf0e10cSrcweir return aRet;
251cdf0e10cSrcweir }
252cdf0e10cSrcweir #undef SERVICE_NAME
253cdf0e10cSrcweir
EncryptorImpl_createInstance(const cssu::Reference<cssl::XMultiServiceFactory> & rSMgr)254cdf0e10cSrcweir cssu::Reference< cssu::XInterface > SAL_CALL EncryptorImpl_createInstance(
255cdf0e10cSrcweir const cssu::Reference< cssl::XMultiServiceFactory >& rSMgr)
256cdf0e10cSrcweir throw( cssu::Exception )
257cdf0e10cSrcweir {
258cdf0e10cSrcweir return (cppu::OWeakObject*) new EncryptorImpl(rSMgr);
259cdf0e10cSrcweir }
260cdf0e10cSrcweir
261cdf0e10cSrcweir /* XServiceInfo */
getImplementationName()262cdf0e10cSrcweir rtl::OUString SAL_CALL EncryptorImpl::getImplementationName( )
263cdf0e10cSrcweir throw (cssu::RuntimeException)
264cdf0e10cSrcweir {
265cdf0e10cSrcweir return EncryptorImpl_getImplementationName();
266cdf0e10cSrcweir }
supportsService(const rtl::OUString & rServiceName)267cdf0e10cSrcweir sal_Bool SAL_CALL EncryptorImpl::supportsService( const rtl::OUString& rServiceName )
268cdf0e10cSrcweir throw (cssu::RuntimeException)
269cdf0e10cSrcweir {
270cdf0e10cSrcweir return EncryptorImpl_supportsService( rServiceName );
271cdf0e10cSrcweir }
getSupportedServiceNames()272cdf0e10cSrcweir cssu::Sequence< rtl::OUString > SAL_CALL EncryptorImpl::getSupportedServiceNames( )
273cdf0e10cSrcweir throw (cssu::RuntimeException)
274cdf0e10cSrcweir {
275cdf0e10cSrcweir return EncryptorImpl_getSupportedServiceNames();
276cdf0e10cSrcweir }
277cdf0e10cSrcweir
278