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