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>
23 #include <com/sun/star/beans/PropertyValue.hpp>
24 #include <com/sun/star/xml/wrapper/XXMLElementWrapper.hpp>
25 #include <com/sun/star/xml/wrapper/XXMLDocumentWrapper.hpp>
26 #include <com/sun/star/xml/crypto/XXMLSignature.hpp>
27 #include <com/sun/star/xml/crypto/XXMLSignatureTemplate.hpp>
28 #include <com/sun/star/xml/crypto/XXMLSecurityContext.hpp>
29 #include <com/sun/star/xml/crypto/XSecurityEnvironment.hpp>
31 using namespace ::rtl
;
32 using namespace ::cppu
;
33 using namespace ::com::sun::star::uno
;
34 using namespace ::com::sun::star::io
;
35 using namespace ::com::sun::star::ucb
;
36 using namespace ::com::sun::star::beans
;
37 using namespace ::com::sun::star::document
;
38 using namespace ::com::sun::star::lang
;
39 using namespace ::com::sun::star::xml::wrapper
;
40 using namespace ::com::sun::star::xml::crypto
;
43 int SAL_CALL
main( int argc
, char **argv
)
45 const char* n_pCertStore
;
46 HCERTSTORE n_hStoreHandle
;
48 xmlDocPtr doc
= NULL
;
55 OUString
* uri
= NULL
;
56 Reference
< XUriBinding
> xUriBinding
;
57 FILE* dstFile
= NULL
;
59 if( argc
!=4 && argc
!= 5 ) {
60 fprintf( stderr
, "Usage: %s <file_url of template> <file_url of result> <rdb file>\n" , argv
[0] ) ;
61 fprintf( stderr
, "Or: \t%s <file_url of template> <file_url of result> <rdb file> < Cert Store Name >\n\n" , argv
[0] ) ;
65 for( int hhh
= 0 ; hhh
< 4 ; hhh
++ ) {
67 //Init libxml and libxslt libraries
70 xmlLoadExtDtdDefaultValue
= XML_DETECT_IDS
| XML_COMPLETE_ATTRS
;
71 xmlSubstituteEntitiesDefault(1);
73 #ifndef XMLSEC_NO_XSLT
74 xmlIndentTreeOutput
= 1;
75 #endif // XMLSEC_NO_XSLT
77 //Initialize the crypto engine
79 n_pCertStore
= argv
[4] ;
80 n_hStoreHandle
= CertOpenSystemStore( NULL
, n_pCertStore
) ;
81 if( n_hStoreHandle
== NULL
) {
82 fprintf( stderr
, "Can not open the system cert store %s\n", n_pCertStore
) ;
87 n_hStoreHandle
= NULL
;
89 xmlSecMSCryptoAppInit( n_pCertStore
) ;
92 doc
= xmlParseFile( argv
[1] ) ;
93 if( doc
== NULL
|| xmlDocGetRootElement( doc
) == NULL
) {
94 fprintf( stderr
, "### Cannot load template xml document!\n" ) ;
98 //Find the signature template
99 tplNode
= xmlSecFindNode( xmlDocGetRootElement( doc
), xmlSecNodeSignature
, xmlSecDSigNs
) ;
100 if( tplNode
== NULL
) {
101 fprintf( stderr
, "### Cannot find the signature template!\n" ) ;
105 //Find the element with ID attribute
106 //Here we only try to find the "document" node.
107 tarNode
= xmlSecFindNode( xmlDocGetRootElement( doc
), ( xmlChar
* )"document", ( xmlChar
* )"http://openoffice.org/2000/office" ) ;
108 if( tarNode
== NULL
) {
109 tarNode
= xmlSecFindNode( xmlDocGetRootElement( doc
), ( xmlChar
* )"document", NULL
) ;
112 //Find the "id" attrbute in the element
113 if( tarNode
!= NULL
) {
114 if( ( idAttr
= xmlHasProp( tarNode
, ( xmlChar
* )"id" ) ) != NULL
) {
116 } else if( ( idAttr
= xmlHasProp( tarNode
, ( xmlChar
* )"Id" ) ) != NULL
) {
124 if( idAttr
!= NULL
) {
125 idValue
= xmlNodeListGetString( tarNode
->doc
, idAttr
->children
, 1 ) ;
126 if( idValue
== NULL
) {
127 fprintf( stderr
, "### the ID value is NULL!\n" ) ;
131 if( xmlAddID( NULL
, doc
, idValue
, idAttr
) == NULL
) {
132 fprintf( stderr
, "### Can not add the ID value!\n" ) ;
138 //Find the signature reference
139 tarNode
= xmlSecFindNode( tplNode
, xmlSecNodeReference
, xmlSecDSigNs
) ;
140 if( tarNode
== NULL
) {
141 fprintf( stderr
, "### Cannot find the signature reference!\n" ) ;
145 //Find the "URI" attrbute in the reference
146 uriAttr
= xmlHasProp( tarNode
, ( xmlChar
* )"URI" ) ;
147 if( tarNode
== NULL
) {
148 fprintf( stderr
, "### Cannot find URI of the reference!\n" ) ;
152 //Get the "URI" attrbute value
153 uriValue
= xmlNodeListGetString( tarNode
->doc
, uriAttr
->children
, 1 ) ;
154 if( uriValue
== NULL
) {
155 fprintf( stderr
, "### the URI value is NULL!\n" ) ;
159 if( strchr( ( const char* )uriValue
, '/' ) != NULL
&& strchr( ( const char* )uriValue
, '#' ) == NULL
) {
160 fprintf( stdout
, "### Find a stream URI [%s]\n", uriValue
) ;
161 // uri = new ::rtl::OUString( ( const sal_Unicode* )uriValue ) ;
162 uri
= new ::rtl::OUString( ( const sal_Char
* )uriValue
, xmlStrlen( uriValue
), RTL_TEXTENCODING_ASCII_US
) ;
166 fprintf( stdout
, "### Find the URI [%s]\n", OUStringToOString( *uri
, RTL_TEXTENCODING_ASCII_US
).getStr() ) ;
167 Reference
< XInputStream
> xStream
= createStreamFromFile( *uri
) ;
168 if( !xStream
.is() ) {
169 fprintf( stderr
, "### Can not get the URI stream!\n" ) ;
173 xUriBinding
= new OUriBinding( *uri
, xStream
) ;
177 Reference
< XMultiComponentFactory
> xManager
= NULL
;
178 Reference
< XComponentContext
> xContext
= NULL
;
180 xManager
= serviceManager( xContext
, OUString::createFromAscii( "local" ), OUString::createFromAscii( argv
[3] ) ) ;
181 OSL_ENSURE( xManager
.is() ,
183 "Cannot get service manager" ) ;
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 \"wrapper.XMLElementWrapper\"" ) ;
192 Reference
< XXMLElementWrapper
> xElement( element
, UNO_QUERY
) ;
193 OSL_ENSURE( xElement
.is() ,
195 "Cannot get interface of \"XXMLElement\" from service \"xsec.XMLElement\"" ) ;
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.XMLElement\"" ) ;
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\"" ) ;
288 xTemplate
= xSigner
->generate( xTemplate
, xSecEnv
) ;
289 OSL_ENSURE( xTemplate
.is() ,
291 "Cannot generate the xml signature" ) ;
293 SecurityOperationStatus m_nStatus
= xTemplate
->getStatus();
295 if (m_nStatus
== SecurityOperationStatus_OPERATION_SUCCEEDED
)
297 fprintf( stdout
, "Operation succeeds.\n") ;
301 fprintf( stdout
, "Operation fails.\n") ;
303 } catch( Exception
& e
) {
304 fprintf( stderr
, "Error Message: %s\n" , OUStringToOString( e
.Message
, RTL_TEXTENCODING_ASCII_US
).getStr() ) ;
308 dstFile
= fopen( argv
[2], "w" ) ;
309 if( dstFile
== NULL
) {
310 fprintf( stderr
, "### Can not open file %s\n", argv
[2] ) ;
315 xmlDocDump( dstFile
, doc
) ;
321 if( dstFile
!= NULL
)
327 if( n_hStoreHandle
!= NULL
)
328 CertCloseStore( n_hStoreHandle
, CERT_CLOSE_STORE_FORCE_FLAG
) ;
330 xmlSecMSCryptoAppShutdown() ;
332 /* Shutdown libxslt/libxml */
333 #ifndef XMLSEC_NO_XSLT
334 xsltCleanupGlobals();
335 #endif /* XMLSEC_NO_XSLT */