1 /** -- C++ Source File -- **/
3 // MARKER(update_precomp.py): autogen include statement, do not remove
4 #include "precompiled_xmlsecurity.hxx"
8 #include "libxml/tree.h"
9 #include "libxml/parser.h"
10 #ifndef XMLSEC_NO_XSLT
11 #include "libxslt/xslt.h"
14 #include "securityenvironment_mscryptimpl.hxx"
15 #include "xmlelementwrapper_xmlsecimpl.hxx"
17 #include "xmlsec/strings.h"
18 #include "xmlsec/mscrypto/app.h"
19 #include "xmlsec/xmltree.h"
21 #include <rtl/ustring.hxx>
22 #include <cppuhelper/servicefactory.hxx>
24 #include <com/sun/star/lang/XComponent.hpp>
25 #include <com/sun/star/beans/PropertyValue.hpp>
26 #include <com/sun/star/xml/wrapper/XXMLElementWrapper.hpp>
27 #include <com/sun/star/xml/wrapper/XXMLDocumentWrapper.hpp>
28 #include <com/sun/star/xml/crypto/XXMLSignature.hpp>
29 #include <com/sun/star/xml/crypto/XXMLSignatureTemplate.hpp>
30 #include <com/sun/star/xml/crypto/XXMLSecurityContext.hpp>
31 #include <com/sun/star/xml/crypto/XSecurityEnvironment.hpp>
33 using namespace ::rtl
;
34 using namespace ::cppu
;
35 using namespace ::com::sun::star::uno
;
36 using namespace ::com::sun::star::io
;
37 using namespace ::com::sun::star::ucb
;
38 using namespace ::com::sun::star::beans
;
39 using namespace ::com::sun::star::document
;
40 using namespace ::com::sun::star::lang
;
41 using namespace ::com::sun::star::registry
;
42 using namespace ::com::sun::star::xml::wrapper
;
43 using namespace ::com::sun::star::xml::crypto
;
46 int SAL_CALL
main( int argc
, char **argv
)
48 const char* n_pCertStore
;
49 HCERTSTORE n_hStoreHandle
;
51 xmlDocPtr doc
= NULL
;
58 OUString
* uri
= NULL
;
59 Reference
< XUriBinding
> xUriBinding
;
60 FILE* dstFile
= NULL
;
62 if( argc
!=3 && argc
!= 4 ) {
63 fprintf( stderr
, "Usage: %s <file_url> <rdb file>\n" , argv
[0] ) ;
64 fprintf( stderr
, "Or: \t%s <file_url> <rdb file> < Cert Store Name >\n\n" , argv
[0] ) ;
68 for( int hhh
= 0 ; hhh
< 1 ; hhh
++ ) {
70 //Init libxml and libxslt libraries
73 xmlLoadExtDtdDefaultValue
= XML_DETECT_IDS
| XML_COMPLETE_ATTRS
;
74 xmlSubstituteEntitiesDefault(1);
76 #ifndef XMLSEC_NO_XSLT
77 xmlIndentTreeOutput
= 1;
78 #endif // XMLSEC_NO_XSLT
80 //Initialize the crypto engine
82 n_pCertStore
= argv
[3] ;
83 n_hStoreHandle
= CertOpenSystemStore( NULL
, n_pCertStore
) ;
84 if( n_hStoreHandle
== NULL
) {
85 fprintf( stderr
, "Can not open the system cert store %s\n", n_pCertStore
) ;
90 n_hStoreHandle
= NULL
;
92 xmlSecMSCryptoAppInit( n_pCertStore
) ;
95 doc
= xmlParseFile( argv
[1] ) ;
96 if( doc
== NULL
|| xmlDocGetRootElement( doc
) == NULL
) {
97 fprintf( stderr
, "### Cannot load template xml document!\n" ) ;
101 //Find the signature template
102 tplNode
= xmlSecFindNode( xmlDocGetRootElement( doc
), xmlSecNodeSignature
, xmlSecDSigNs
) ;
103 if( tplNode
== NULL
) {
104 fprintf( stderr
, "### Cannot find the signature template!\n" ) ;
108 //Find the element with ID attribute
109 tarNode
= xmlSecFindNode( xmlDocGetRootElement( doc
), ( xmlChar
* )"document", ( xmlChar
* )"http://openoffice.org/2000/office" ) ;
110 if( tarNode
== NULL
) {
111 tarNode
= xmlSecFindNode( xmlDocGetRootElement( doc
), ( xmlChar
* )"document", NULL
) ;
114 //Find the "id" attrbute in the element
115 if( tarNode
!= NULL
) {
116 if( ( idAttr
= xmlHasProp( tarNode
, ( xmlChar
* )"id" ) ) != NULL
) {
118 } else if( ( idAttr
= xmlHasProp( tarNode
, ( xmlChar
* )"Id" ) ) != NULL
) {
126 if( idAttr
!= NULL
) {
127 idValue
= xmlNodeListGetString( tarNode
->doc
, idAttr
->children
, 1 ) ;
128 if( idValue
== NULL
) {
129 fprintf( stderr
, "### the ID value is NULL!\n" ) ;
133 if( xmlAddID( NULL
, doc
, idValue
, idAttr
) == NULL
) {
134 fprintf( stderr
, "### Can not add the ID value!\n" ) ;
140 //Find the signature reference
141 tarNode
= xmlSecFindNode( tplNode
, xmlSecNodeReference
, xmlSecDSigNs
) ;
142 if( tarNode
== NULL
) {
143 fprintf( stderr
, "### Cannot find the signature reference!\n" ) ;
147 //Find the "URI" attrbute in the reference
148 uriAttr
= xmlHasProp( tarNode
, ( xmlChar
* )"URI" ) ;
149 if( tarNode
== NULL
) {
150 fprintf( stderr
, "### Cannot find URI of the reference!\n" ) ;
154 //Get the "URI" attrbute value
155 uriValue
= xmlNodeListGetString( tarNode
->doc
, uriAttr
->children
, 1 ) ;
156 if( uriValue
== NULL
) {
157 fprintf( stderr
, "### the URI value is NULL!\n" ) ;
161 if( strchr( ( const char* )uriValue
, '/' ) != NULL
&& strchr( ( const char* )uriValue
, '#' ) == NULL
) {
162 fprintf( stdout
, "### Find a stream URI [%s]\n", uriValue
) ;
163 // uri = new ::rtl::OUString( ( const sal_Unicode* )uriValue ) ;
164 uri
= new ::rtl::OUString( ( const sal_Char
* )uriValue
, xmlStrlen( uriValue
), RTL_TEXTENCODING_ASCII_US
) ;
168 fprintf( stdout
, "### Find the URI [%s]\n", OUStringToOString( *uri
, RTL_TEXTENCODING_ASCII_US
).getStr() ) ;
169 Reference
< XInputStream
> xStream
= createStreamFromFile( *uri
) ;
170 if( !xStream
.is() ) {
171 fprintf( stderr
, "### Can not get the URI stream!\n" ) ;
175 xUriBinding
= new OUriBinding( *uri
, xStream
) ;
180 Reference
< XMultiComponentFactory
> xManager
= NULL
;
181 Reference
< XComponentContext
> xContext
= NULL
;
183 xManager
= serviceManager( xContext
, OUString::createFromAscii( "local" ), OUString::createFromAscii( argv
[2] ) ) ;
185 //Create signature template
186 Reference
< XInterface
> element
=
187 xManager
->createInstanceWithContext( OUString::createFromAscii( "com.sun.star.xml.security.bridge.xmlsec.XMLElementWrapper_XmlSecImpl" ) , xContext
) ;
188 OSL_ENSURE( element
.is() ,
190 "Cannot get service instance of \"xsec.XMLElementWrapper\"" ) ;
192 Reference
< XXMLElementWrapper
> xElement( element
, UNO_QUERY
) ;
193 OSL_ENSURE( xElement
.is() ,
195 "Cannot get interface of \"XXMLElementWrapper\" from service \"xsec.XMLElementWrapper\"" ) ;
197 Reference
< XUnoTunnel
> xEleTunnel( xElement
, UNO_QUERY
) ;
198 OSL_ENSURE( xEleTunnel
.is() ,
200 "Cannot get interface of \"XUnoTunnel\" from service \"xsec.XMLElement\"" ) ;
202 XMLElementWrapper_XmlSecImpl
* pElement
= ( XMLElementWrapper_XmlSecImpl
* )xEleTunnel
->getSomething( XMLElementWrapper_XmlSecImpl::getUnoTunnelImplementationId() ) ;
203 OSL_ENSURE( pElement
!= NULL
,
205 "Cannot get implementation of \"xsec.XMLElementWrapper\"" ) ;
207 //Set signature template
208 pElement
->setNativeElement( tplNode
) ;
210 //Build XML Signature template
211 Reference
< XInterface
> signtpl
=
212 xManager
->createInstanceWithContext( OUString::createFromAscii("com.sun.star.xml.crypto.XMLSignatureTemplate"), xContext
) ;
213 OSL_ENSURE( signtpl
.is() ,
215 "Cannot get service instance of \"xsec.XMLSignatureTemplate\"" ) ;
217 Reference
< XXMLSignatureTemplate
> xTemplate( signtpl
, UNO_QUERY
) ;
218 OSL_ENSURE( xTemplate
.is() ,
220 "Cannot get interface of \"XXMLSignatureTemplate\" from service \"xsec.XMLSignatureTemplate\"" ) ;
222 //Import the signature template
223 xTemplate
->setTemplate( xElement
) ;
225 //Import the URI/Stream binding
226 if( xUriBinding
.is() )
227 xTemplate
->setBinding( xUriBinding
) ;
229 //Create security environment
230 //Build Security Environment
231 Reference
< XInterface
> xsecenv
=
232 xManager
->createInstanceWithContext( OUString::createFromAscii("com.sun.star.xml.security.bridge.xmlsec.SecurityEnvironment_MSCryptImpl"), xContext
) ;
233 OSL_ENSURE( xsecenv
.is() ,
235 "Cannot get service instance of \"xsec.SecurityEnvironment\"" ) ;
237 Reference
< XSecurityEnvironment
> xSecEnv( xsecenv
, UNO_QUERY
) ;
238 OSL_ENSURE( xSecEnv
.is() ,
240 "Cannot get interface of \"XSecurityEnvironment\" from service \"xsec.SecurityEnvironment\"" ) ;
242 //Setup key slot and certDb
243 Reference
< XUnoTunnel
> xEnvTunnel( xsecenv
, UNO_QUERY
) ;
244 OSL_ENSURE( xElement
.is() ,
246 "Cannot get interface of \"XUnoTunnel\" from service \"xsec.SecurityEnvironment\"" ) ;
248 SecurityEnvironment_MSCryptImpl
* pSecEnv
= ( SecurityEnvironment_MSCryptImpl
* )xEnvTunnel
->getSomething( SecurityEnvironment_MSCryptImpl::getUnoTunnelId() ) ;
249 OSL_ENSURE( pSecEnv
!= NULL
,
251 "Cannot get implementation of \"xsec.SecurityEnvironment\"" ) ;
253 //Setup key slot and certDb
254 if( n_hStoreHandle
!= NULL
) {
255 pSecEnv
->setCryptoSlot( n_hStoreHandle
) ;
256 pSecEnv
->setCertDb( n_hStoreHandle
) ;
258 pSecEnv
->enableDefaultCrypt( sal_True
) ;
261 //Build XML Security Context
262 Reference
< XInterface
> xmlsecctx
=
263 xManager
->createInstanceWithContext( OUString::createFromAscii("com.sun.star.xml.security.bridge.xmlsec.XMLSecurityContext_MSCryptImpl"), xContext
) ;
264 OSL_ENSURE( xsecenv
.is() ,
266 "Cannot get service instance of \"xsec.XMLSecurityContext\"" ) ;
268 Reference
< XXMLSecurityContext
> xSecCtx( xmlsecctx
, UNO_QUERY
) ;
269 OSL_ENSURE( xSecCtx
.is() ,
271 "Cannot get interface of \"XXMLSecurityContext\" from service \"xsec.XMLSecurityContext\"" ) ;
273 xSecCtx
->addSecurityEnvironment( xSecEnv
) ;
275 //Generate XML signature
276 Reference
< XInterface
> xmlsigner
=
277 xManager
->createInstanceWithContext( OUString::createFromAscii("com.sun.star.xml.security.bridge.xmlsec.XMLSignature_MSCryptImpl"), xContext
) ;
278 OSL_ENSURE( xmlsigner
.is() ,
280 "Cannot get service instance of \"xsec.XMLSignature\"" ) ;
282 Reference
< XXMLSignature
> xSigner( xmlsigner
, UNO_QUERY
) ;
283 OSL_ENSURE( xSigner
.is() ,
285 "Cannot get interface of \"XXMLSignature\" from service \"xsec.XMLSignature\"" ) ;
289 xTemplate
= xSigner
->validate( xTemplate
, xSecCtx
) ;
291 com::sun::star::xml::crypto::SecurityOperationStatus m_nStatus
= xTemplate
->getStatus();
293 if (m_nStatus
== SecurityOperationStatus_OPERATION_SUCCEEDED
)
295 fprintf( stdout
, "Operation succeeds.\n") ;
299 fprintf( stdout
, "Operation fails.\n") ;
301 } catch( Exception
& e
) {
302 fprintf( stderr
, "Error Message: %s\n" , OUStringToOString( e
.Message
, RTL_TEXTENCODING_ASCII_US
).getStr() ) ;
313 if( n_hStoreHandle
!= NULL
)
314 CertCloseStore( n_hStoreHandle
, CERT_CLOSE_STORE_FORCE_FLAG
) ;
316 xmlSecMSCryptoAppShutdown() ;
318 /* Shutdown libxslt/libxml */
319 #ifndef XMLSEC_NO_XSLT
320 xsltCleanupGlobals();
321 #endif /* XMLSEC_NO_XSLT */