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 /** -- C++ Source File -- **/ 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_xmlsecurity.hxx" 26 #include <stdio.h> 27 #include "helper.hxx" 28 29 #include "libxml/tree.h" 30 #include "libxml/parser.h" 31 #ifndef XMLSEC_NO_XSLT 32 #include "libxslt/xslt.h" 33 #endif 34 35 36 #include "securityenvironment_mscryptimpl.hxx" 37 #include "xmlelementwrapper_xmlsecimpl.hxx" 38 39 #include "nspr.h" 40 #include "prtypes.h" 41 42 #include "pk11func.h" 43 #include "cert.h" 44 #include "cryptohi.h" 45 #include "certdb.h" 46 #include "nss.h" 47 48 #include "xmlsec/strings.h" 49 #include "xmlsec/xmltree.h" 50 51 #include <rtl/ustring.hxx> 52 #include <cppuhelper/bootstrap.hxx> 53 #include <cppuhelper/servicefactory.hxx> 54 55 #include <com/sun/star/beans/PropertyValue.hpp> 56 #include <com/sun/star/xml/wrapper/XXMLElementWrapper.hpp> 57 #include <com/sun/star/xml/wrapper/XXMLDocumentWrapper.hpp> 58 #include <com/sun/star/xml/crypto/XXMLEncryption.hpp> 59 #include <com/sun/star/xml/crypto/XXMLEncryptionTemplate.hpp> 60 #include <com/sun/star/xml/crypto/XXMLSecurityContext.hpp> 61 #include <com/sun/star/xml/crypto/XSecurityEnvironment.hpp> 62 63 64 using namespace ::rtl ; 65 using namespace ::cppu ; 66 using namespace ::com::sun::star::uno ; 67 using namespace ::com::sun::star::io ; 68 using namespace ::com::sun::star::ucb ; 69 using namespace ::com::sun::star::beans ; 70 using namespace ::com::sun::star::document ; 71 using namespace ::com::sun::star::lang ; 72 using namespace ::com::sun::star::registry ; 73 using namespace ::com::sun::star::xml::wrapper ; 74 using namespace ::com::sun::star::xml::crypto ; 75 76 77 int SAL_CALL main( int argc, char **argv ) 78 { 79 CERTCertDBHandle* certHandle = NULL ; 80 PK11SlotInfo* slot = NULL ; 81 xmlDocPtr doc = NULL ; 82 xmlNodePtr tplNode ; 83 xmlNodePtr tarNode ; 84 FILE* dstFile = NULL ; 85 86 87 if( argc != 5 ) { 88 fprintf( stderr, "Usage: %s < CertDir > <input file_url> <output file_url> <rdb file>\n\n" , argv[0] ) ; 89 return 1 ; 90 } 91 92 //Init libxml and libxslt libraries 93 xmlInitParser(); 94 LIBXML_TEST_VERSION 95 xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS; 96 xmlSubstituteEntitiesDefault(1); 97 98 #ifndef XMLSEC_NO_XSLT 99 xmlIndentTreeOutput = 1; 100 #endif // XMLSEC_NO_XSLT 101 102 103 //Initialize NSPR and NSS 104 PR_Init( PR_SYSTEM_THREAD, PR_PRIORITY_NORMAL, 1 ) ; 105 PK11_SetPasswordFunc( PriPK11PasswordFunc ) ; 106 if( NSS_Init( argv[1] ) != SECSuccess ) { 107 fprintf( stderr , "### cannot intialize NSS!\n" ) ; 108 goto done ; 109 } 110 111 certHandle = CERT_GetDefaultCertDB() ; 112 slot = PK11_GetInternalKeySlot() ; 113 114 //Load XML document 115 doc = xmlParseFile( argv[2] ) ; 116 if( doc == NULL || xmlDocGetRootElement( doc ) == NULL ) { 117 fprintf( stderr , "### Cannot load template xml document!\n" ) ; 118 goto done ; 119 } 120 121 //Find the encryption template 122 tplNode = xmlSecFindNode( xmlDocGetRootElement( doc ), xmlSecNodeEncryptedData, xmlSecEncNs ) ; 123 if( tplNode == NULL ) { 124 fprintf( stderr , "### Cannot find the encryption template!\n" ) ; 125 goto done ; 126 } 127 128 129 try { 130 Reference< XMultiComponentFactory > xManager = NULL ; 131 Reference< XComponentContext > xContext = NULL ; 132 133 xManager = serviceManager( xContext , OUString::createFromAscii( "local" ), OUString::createFromAscii( argv[4] ) ) ; 134 135 //Create encryption template 136 Reference< XInterface > tplElement = 137 xManager->createInstanceWithContext( OUString::createFromAscii( "com.sun.star.xml.xsec.XMLElementWrapper" ) , xContext ) ; 138 OSL_ENSURE( tplElement.is() , 139 "Decryptor - " 140 "Cannot get service instance of \"xsec.XMLElementWrapper\"" ) ; 141 142 Reference< XXMLElementWrapper > xTplElement( tplElement , UNO_QUERY ) ; 143 OSL_ENSURE( xTplElement.is() , 144 "Decryptor - " 145 "Cannot get interface of \"XXMLElementWrapper\" from service \"xsec.XMLElementWrapper\"" ) ; 146 147 Reference< XUnoTunnel > xTplEleTunnel( xTplElement , UNO_QUERY ) ; 148 OSL_ENSURE( xTplEleTunnel.is() , 149 "Decryptor - " 150 "Cannot get interface of \"XUnoTunnel\" from service \"xsec.XMLElementWrapper\"" ) ; 151 152 XMLElementWrapper_XmlSecImpl* pTplElement = ( XMLElementWrapper_XmlSecImpl* )xTplEleTunnel->getSomething( XMLElementWrapper_XmlSecImpl::getUnoTunnelImplementationId() ) ; 153 OSL_ENSURE( pTplElement != NULL , 154 "Decryptor - " 155 "Cannot get implementation of \"xsec.XMLElementWrapper\"" ) ; 156 157 pTplElement->setNativeElement( tplNode ) ; 158 159 //Build XML Encryption template 160 Reference< XInterface > enctpl = 161 xManager->createInstanceWithContext( OUString::createFromAscii("com.sun.star.xml.xsec.XMLEncryptionTemplate"), xContext ) ; 162 OSL_ENSURE( enctpl.is() , 163 "Decryptor - " 164 "Cannot get service instance of \"xsec.XMLEncryptionTemplate\"" ) ; 165 166 Reference< XXMLEncryptionTemplate > xTemplate( enctpl , UNO_QUERY ) ; 167 OSL_ENSURE( xTemplate.is() , 168 "Decryptor - " 169 "Cannot get interface of \"XXMLEncryptionTemplate\" from service \"xsec.XMLEncryptionTemplate\"" ) ; 170 171 //Import the encryption template 172 xTemplate->setTemplate( xTplElement ) ; 173 174 //Create security environment 175 //Build Security Environment 176 Reference< XInterface > xsecenv = 177 xManager->createInstanceWithContext( OUString::createFromAscii("com.sun.star.xml.xsec.SecurityEnvironment"), xContext ) ; 178 OSL_ENSURE( xsecenv.is() , 179 "Decryptor - " 180 "Cannot get service instance of \"xsec.SecurityEnvironment\"" ) ; 181 182 Reference< XSecurityEnvironment > xSecEnv( xsecenv , UNO_QUERY ) ; 183 OSL_ENSURE( xSecEnv.is() , 184 "Decryptor - " 185 "Cannot get interface of \"XSecurityEnvironment\" from service \"xsec.SecurityEnvironment\"" ) ; 186 187 //Setup key slot and certDb 188 Reference< XUnoTunnel > xEnvTunnel( xsecenv , UNO_QUERY ) ; 189 OSL_ENSURE( xEnvTunnel.is() , 190 "Decryptor - " 191 "Cannot get interface of \"XUnoTunnel\" from service \"xsec.SecurityEnvironment\"" ) ; 192 193 SecurityEnvironment_XmlSecImpl* pSecEnv = ( SecurityEnvironment_XmlSecImpl* )xEnvTunnel->getSomething( SecurityEnvironment_XmlSecImpl::getUnoTunnelId() ) ; 194 OSL_ENSURE( pSecEnv != NULL , 195 "Decryptor - " 196 "Cannot get implementation of \"xsec.SecurityEnvironment\"" ) ; 197 198 pSecEnv->setCryptoSlot( slot ) ; 199 pSecEnv->setCertDb( certHandle ) ; 200 201 202 //Build XML Security Context 203 Reference< XInterface > xmlsecctx = 204 xManager->createInstanceWithContext( OUString::createFromAscii("com.sun.star.xml.xsec.XMLSecurityContext"), xContext ) ; 205 OSL_ENSURE( xmlsecctx.is() , 206 "Decryptor - " 207 "Cannot get service instance of \"xsec.XMLSecurityContext\"" ) ; 208 209 Reference< XXMLSecurityContext > xSecCtx( xmlsecctx , UNO_QUERY ) ; 210 OSL_ENSURE( xSecCtx.is() , 211 "Decryptor - " 212 "Cannot get interface of \"XXMLSecurityContext\" from service \"xsec.XMLSecurityContext\"" ) ; 213 214 xSecCtx->setSecurityEnvironment( xSecEnv ) ; 215 216 217 //Get encrypter 218 Reference< XInterface > xmlencrypter = 219 xManager->createInstanceWithContext( OUString::createFromAscii("com.sun.star.xml.xsec.XMLEncryption"), xContext ) ; 220 OSL_ENSURE( xmlencrypter.is() , 221 "Decryptor - " 222 "Cannot get service instance of \"xsec.XMLEncryption\"" ) ; 223 224 Reference< XXMLEncryption > xEncrypter( xmlencrypter , UNO_QUERY ) ; 225 OSL_ENSURE( xEncrypter.is() , 226 "Decryptor - " 227 "Cannot get interface of \"XXMLEncryption\" from service \"xsec.XMLEncryption\"" ) ; 228 229 230 //Perform decryption 231 Reference< XXMLElementWrapper> xDecrRes = xEncrypter->decrypt( xTemplate , xSecCtx ) ; 232 OSL_ENSURE( xDecrRes.is() , 233 "Decryptor - " 234 "Cannot decrypt the xml document" ) ; 235 } catch( Exception& e ) { 236 fprintf( stderr , "Error Message: %s\n" , OUStringToOString( e.Message , RTL_TEXTENCODING_ASCII_US ).getStr() ) ; 237 goto done ; 238 } 239 240 dstFile = fopen( argv[3], "w" ) ; 241 if( dstFile == NULL ) { 242 fprintf( stderr , "### Can not open file %s\n", argv[3] ) ; 243 goto done ; 244 } 245 246 //Save result 247 xmlDocDump( dstFile, doc ) ; 248 249 done: 250 if( dstFile != NULL ) 251 fclose( dstFile ) ; 252 253 if( slot != NULL ) 254 PK11_FreeSlot( slot ) ; 255 256 PK11_LogoutAll() ; 257 NSS_Shutdown() ; 258 259 /* Shutdown libxslt/libxml */ 260 #ifndef XMLSEC_NO_XSLT 261 xsltCleanupGlobals(); 262 #endif /* XMLSEC_NO_XSLT */ 263 xmlCleanupParser(); 264 265 return 0; 266 } 267 268