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 <sal/main.h>
28 #include <vcl/event.hxx>
29 #include <vcl/svapp.hxx>
30 #include <vcl/wrkwin.hxx>
31 #include <vcl/msgbox.hxx>
32 #include <vcl/fixed.hxx>
33 #include <vcl/edit.hxx>
34 #include <vcl/button.hxx>
35 #include <vcl/lstbox.hxx>
36 #include <svtools/filectrl.hxx>
37 #include <tools/urlobj.hxx>
38 #include <osl/file.hxx>
39 
40 #include <svtools/docpasswdrequest.hxx>
41 
42 #include <comphelper/processfactory.hxx>
43 #include <cppuhelper/servicefactory.hxx>
44 #include <cppuhelper/bootstrap.hxx>
45 #include <unotools/streamhelper.hxx>
46 
47 #include <ucbhelper/contentbroker.hxx>
48 #include <ucbhelper/configurationkeys.hxx>
49 
50 // Will be in comphelper if CWS MAV09 is integrated
51 #include <comphelper/storagehelper.hxx>
52 
53 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
54 
55 #include <xmlsecurity/xmlsignaturehelper.hxx>
56 #include <xmlsecurity/digitalsignaturesdialog.hxx>
57 #include <xmlsecurity/certificatechooser.hxx>
58 #include <xmlsecurity/biginteger.hxx>
59 
60 #include <com/sun/star/security/XDocumentDigitalSignatures.hpp>
61 
62 using namespace ::com::sun::star;
63 using namespace ::com::sun::star;
64 
65 void Main();
66 
67 #define TEXTFIELDWIDTH	80
68 #define TEXTFIELDSTARTX	10
69 
70 #define EDITWIDTH		200
71 #define EDITHEIGHT		20
72 
73 #define FIXEDLINEHEIGHT	15
74 
75 #define BUTTONWIDTH		50
76 #define BUTTONHEIGHT	22
77 #define BUTTONSPACE     20
78 
79 #define LISTBOXHEIGHT   120
80 
81 // #define TEST_IMPLEMENTATION_DIRECTLY
82 
83 
84 // -----------------------------------------------------------------------
85 
SAL_IMPLEMENT_MAIN()86     SAL_IMPLEMENT_MAIN()
87 {
88     uno::Reference< lang::XMultiServiceFactory > xMSF;
89 	try
90 	{
91         uno::Reference< uno::XComponentContext > xCtx( cppu::defaultBootstrap_InitialComponentContext() );
92         if ( !xCtx.is() )
93         {
94             DBG_ERROR( "Error creating initial component context!" );
95             return -1;
96         }
97 
98         xMSF = uno::Reference< lang::XMultiServiceFactory >(xCtx->getServiceManager(), uno::UNO_QUERY );
99 
100         if ( !xMSF.is() )
101         {
102             DBG_ERROR( "No service manager!" );
103             return -1;
104         }
105 
106         // Init USB
107         uno::Sequence< uno::Any > aArgs( 2 );
108         aArgs[ 0 ] <<= rtl::OUString::createFromAscii( UCB_CONFIGURATION_KEY1_LOCAL );
109 	    aArgs[ 1 ] <<= rtl::OUString::createFromAscii( UCB_CONFIGURATION_KEY2_OFFICE );
110 	    sal_Bool bSuccess = ::ucb::ContentBroker::initialize( xMSF, aArgs );
111 	    if ( !bSuccess )
112 	    {
113 		    DBG_ERROR( "Error creating UCB!" );
114 		    return -1;
115 	    }
116 
117 	}
118     catch ( uno::Exception const & )
119 	{
120         DBG_ERROR( "Exception during creation of initial component context!" );
121 		return -1;
122 	}
123 	comphelper::setProcessServiceFactory( xMSF );
124 
125     InitVCL( xMSF );
126     ::Main();
127     DeInitVCL();
128 
129     return 0;
130 }
131 
132 // -----------------------------------------------------------------------
133 
134 class MyWin : public WorkWindow
135 {
136 private:
137     FixedLine   maTokenLine;
138     CheckBox    maCryptoCheckBox;
139 	FixedText	maFixedTextTokenName;
140 	FileControl	maEditTokenName;
141     FixedLine   maTest1Line;
142 	FixedText	maFixedTextXMLFileName;
143 	FileControl	maEditXMLFileName;
144 	FixedText	maFixedTextBINFileName;
145 	FileControl	maEditBINFileName;
146 	FixedText	maFixedTextSIGFileName;
147 	FileControl	maEditSIGFileName;
148 	PushButton	maSignButton;
149 	PushButton	maVerifyButton;
150     FixedLine   maTest2Line;
151 	FixedText	maFixedTextDOCFileName;
152 	FileControl	maEditDOCFileName;
153 	PushButton	maDigitalSignaturesButton;
154 	PushButton	maVerifyDigitalSignaturesButton;
155     FixedLine   maHintLine;
156 	FixedText	maHintText;
157 
158 	DECL_LINK(	CryptoCheckBoxHdl, CheckBox* );
159 	DECL_LINK(	SignButtonHdl, Button* );
160 	DECL_LINK(	VerifyButtonHdl, Button* );
161 	DECL_LINK(	DigitalSignaturesWithServiceHdl, Button* );
162 	DECL_LINK(	VerifyDigitalSignaturesHdl, Button* );
163 	DECL_LINK(	DigitalSignaturesWithTokenHdl, Button* );
164 	DECL_LINK(	StartVerifySignatureHdl, void* );
165 
166 public:
167 				MyWin( Window* pParent, WinBits nWinStyle );
168 
169 };
170 
171 // -----------------------------------------------------------------------
172 
Main()173 void Main()
174 {
175 	MyWin aMainWin( NULL, WB_APP | WB_STDWORK | WB_3DLOOK);
176 	aMainWin.Show();
177 
178 	Application::Execute();
179 }
180 
181 // -----------------------------------------------------------------------
182 
MyWin(Window * pParent,WinBits nWinStyle)183 MyWin::MyWin( Window* pParent, WinBits nWinStyle ) :
184 	WorkWindow( pParent, nWinStyle ),
185     maTokenLine( this ),
186     maTest1Line( this ),
187     maTest2Line( this ),
188     maHintLine( this ),
189 	maFixedTextXMLFileName( this ),
190 	maEditXMLFileName( this, WB_BORDER ),
191 	maFixedTextBINFileName( this ),
192 	maEditBINFileName( this, WB_BORDER ),
193 	maFixedTextSIGFileName( this ),
194 	maEditSIGFileName( this, WB_BORDER ),
195 	maFixedTextTokenName( this ),
196 	maEditTokenName( this, WB_BORDER ),
197 	maFixedTextDOCFileName( this ),
198 	maEditDOCFileName( this, WB_BORDER ),
199 	maSignButton( this ),
200 	maVerifyButton( this ),
201 	maDigitalSignaturesButton( this ),
202 	maVerifyDigitalSignaturesButton( this ),
203 	maHintText( this, WB_WORDBREAK ),
204 	maCryptoCheckBox( this )
205 
206 {
207 #ifdef TEST_IMPLEMENTATION_DIRECTLY
208     Size aOutputSize( 400, 600 );
209 #else
210     Size aOutputSize( 400, 400 );
211 #endif
212 	SetOutputSizePixel( aOutputSize );
213 	SetText( String( RTL_CONSTASCII_USTRINGPARAM( "XML Signature Test" ) ) );
214 
215 	long nY = 15;
216 
217     maTokenLine.SetPosSizePixel( TEXTFIELDSTARTX, nY, aOutputSize.Width()-2*TEXTFIELDSTARTX, FIXEDLINEHEIGHT );
218 	maTokenLine.SetText( String( RTL_CONSTASCII_USTRINGPARAM( "Crypto Settings" ) ) );
219 	maTokenLine.Show();
220 
221 	nY += EDITHEIGHT*3/2;
222 
223 	maCryptoCheckBox.SetPosSizePixel( TEXTFIELDSTARTX, nY, aOutputSize.Width()-2*TEXTFIELDSTARTX, FIXEDLINEHEIGHT );
224 	maCryptoCheckBox.SetText( String( RTL_CONSTASCII_USTRINGPARAM( "Use Default Token (NSS option only)" ) ) );
225 	maCryptoCheckBox.Check( sal_True );
226 	maEditTokenName.Disable();
227 	maFixedTextTokenName.Disable();
228     maCryptoCheckBox.SetClickHdl( LINK( this, MyWin, CryptoCheckBoxHdl ) );
229 	maCryptoCheckBox.Show();
230 
231 	nY += EDITHEIGHT;
232 
233 	maFixedTextTokenName.SetPosSizePixel( TEXTFIELDSTARTX, nY, TEXTFIELDWIDTH, EDITHEIGHT );
234 	maFixedTextTokenName.SetText( String( RTL_CONSTASCII_USTRINGPARAM( "Crypto Token:" ) ) );
235 	maFixedTextTokenName.Show();
236 
237 	maEditTokenName.SetPosSizePixel( TEXTFIELDSTARTX+TEXTFIELDWIDTH, nY, EDITWIDTH, EDITHEIGHT );
238 	maEditTokenName.Show();
239 
240 	nY += EDITHEIGHT*3;
241 
242 #ifdef TEST_IMPLEMENTATION_DIRECTLY
243 
244     maTest1Line.SetPosSizePixel( TEXTFIELDSTARTX, nY, aOutputSize.Width()-2*TEXTFIELDSTARTX, FIXEDLINEHEIGHT );
245 	maTest1Line.SetText( String( RTL_CONSTASCII_USTRINGPARAM( "Test simple files" ) ) );
246 	maTest1Line.Show();
247 
248 	nY += EDITHEIGHT*3/2;
249 
250     maFixedTextXMLFileName.SetPosSizePixel( TEXTFIELDSTARTX, nY, TEXTFIELDWIDTH, EDITHEIGHT );
251 	maFixedTextXMLFileName.SetText( String( RTL_CONSTASCII_USTRINGPARAM( "XML File:" ) ) );
252 	maFixedTextXMLFileName.Show();
253 
254 	maEditXMLFileName.SetPosSizePixel( TEXTFIELDSTARTX+TEXTFIELDWIDTH, nY, EDITWIDTH, EDITHEIGHT );
255 	maEditXMLFileName.Show();
256 
257 	nY += EDITHEIGHT*3/2;
258 
259 	maFixedTextBINFileName.SetPosSizePixel( TEXTFIELDSTARTX, nY, TEXTFIELDWIDTH, EDITHEIGHT );
260 	maFixedTextBINFileName.SetText( String( RTL_CONSTASCII_USTRINGPARAM( "Binary File:" ) ) );
261 	maFixedTextBINFileName.Show();
262 
263 	maEditBINFileName.SetPosSizePixel( TEXTFIELDSTARTX+TEXTFIELDWIDTH, nY, EDITWIDTH, EDITHEIGHT );
264 	maEditBINFileName.Show();
265 
266 	nY += EDITHEIGHT*3/2;
267 
268 	maFixedTextSIGFileName.SetPosSizePixel( TEXTFIELDSTARTX, nY, TEXTFIELDWIDTH, EDITHEIGHT );
269 	maFixedTextSIGFileName.SetText( String( RTL_CONSTASCII_USTRINGPARAM( "Signature File:" ) ) );
270 	maFixedTextSIGFileName.Show();
271 
272 	maEditSIGFileName.SetPosSizePixel( TEXTFIELDSTARTX+TEXTFIELDWIDTH, nY, EDITWIDTH, EDITHEIGHT );
273 	maEditSIGFileName.Show();
274 
275 	nY += EDITHEIGHT*2;
276 
277 	maSignButton.SetPosSizePixel( TEXTFIELDSTARTX, nY, BUTTONWIDTH, BUTTONHEIGHT );
278 	maSignButton.SetText( String( RTL_CONSTASCII_USTRINGPARAM( "Sign" ) ) );
279 	maSignButton.SetClickHdl( LINK( this, MyWin, SignButtonHdl ) );
280 	maSignButton.Show();
281 
282 	maVerifyButton.SetPosSizePixel( TEXTFIELDSTARTX+BUTTONWIDTH+BUTTONSPACE, nY, BUTTONWIDTH, BUTTONHEIGHT );
283 	maVerifyButton.SetText( String( RTL_CONSTASCII_USTRINGPARAM( "Verify" ) ) );
284 	maVerifyButton.SetClickHdl( LINK( this, MyWin, VerifyButtonHdl ) );
285 	maVerifyButton.Show();
286 
287 	nY += EDITHEIGHT*3;
288 
289 #endif // TEST_IMPLEMENTATION_DIRECTLY
290 
291     maTest2Line.SetPosSizePixel( TEXTFIELDSTARTX, nY, aOutputSize.Width()-2*TEXTFIELDSTARTX, FIXEDLINEHEIGHT );
292 	maTest2Line.SetText( String( RTL_CONSTASCII_USTRINGPARAM( "Test Office Document" ) ) );
293 	maTest2Line.Show();
294 
295 	nY += EDITHEIGHT*3/2;
296 
297 
298 	maFixedTextDOCFileName.SetPosSizePixel( TEXTFIELDSTARTX, nY, TEXTFIELDWIDTH, EDITHEIGHT );
299 	maFixedTextDOCFileName.SetText( String( RTL_CONSTASCII_USTRINGPARAM( "Office File:" ) ) );
300 	maFixedTextDOCFileName.Show();
301 
302 	maEditDOCFileName.SetPosSizePixel( TEXTFIELDSTARTX+TEXTFIELDWIDTH, nY, EDITWIDTH, EDITHEIGHT );
303 	maEditDOCFileName.Show();
304 
305 	nY += EDITHEIGHT*2;
306 
307 	maDigitalSignaturesButton.SetPosSizePixel( TEXTFIELDSTARTX, nY, BUTTONWIDTH*2, BUTTONHEIGHT );
308 	maDigitalSignaturesButton.SetText( String( RTL_CONSTASCII_USTRINGPARAM( "Digital Signatures..." ) ) );
309 	maDigitalSignaturesButton.SetClickHdl( LINK( this, MyWin, DigitalSignaturesWithServiceHdl ) );
310 	maDigitalSignaturesButton.Show();
311 
312 	maVerifyDigitalSignaturesButton.SetPosSizePixel( TEXTFIELDSTARTX+BUTTONWIDTH*2+BUTTONSPACE, nY, BUTTONWIDTH*2, BUTTONHEIGHT );
313 	maVerifyDigitalSignaturesButton.SetText( String( RTL_CONSTASCII_USTRINGPARAM( "Verify Signatures" ) ) );
314 	maVerifyDigitalSignaturesButton.SetClickHdl( LINK( this, MyWin, VerifyDigitalSignaturesHdl ) );
315 	maVerifyDigitalSignaturesButton.Show();
316 
317     nY += EDITHEIGHT*2;
318 
319     maHintLine.SetPosSizePixel( TEXTFIELDSTARTX, nY, aOutputSize.Width()-2*TEXTFIELDSTARTX, FIXEDLINEHEIGHT );
320 	maHintLine.Show();
321 
322     nY += EDITHEIGHT*2;
323 
324 	maHintText.SetPosSizePixel( TEXTFIELDSTARTX, nY, aOutputSize.Width()-2*TEXTFIELDSTARTX, aOutputSize.Height()-nY );
325 	maHintText.SetText( String( RTL_CONSTASCII_USTRINGPARAM( "Hint: Copy crypto files from xmlsecurity/tools/cryptoken/nss and sample files from xmlsecurity/tools/examples to <temp>/nss.\nThis location will be used from the demo as the default location." ) ) );
326 	maHintText.Show();
327 
328     // Help the user with some default values
329     ::rtl::OUString aTempDirURL;
330     ::osl::File::getTempDirURL( aTempDirURL );
331     INetURLObject aURLObj( aTempDirURL );
332     aURLObj.insertName( String( RTL_CONSTASCII_USTRINGPARAM( "nss" ) ), true );
333     ::rtl::OUString aNSSFolder = aURLObj.getFSysPath( INetURLObject::FSYS_DETECT );
334     String aDefaultXMLFileName( aNSSFolder );
335     maEditXMLFileName.SetText( aNSSFolder + String( RTL_CONSTASCII_USTRINGPARAM( "demo-sample.xml" ) ) );
336     maEditBINFileName.SetText( aNSSFolder + String( RTL_CONSTASCII_USTRINGPARAM( "demo-sample.gif" ) ) );
337     maEditDOCFileName.SetText( aNSSFolder + String( RTL_CONSTASCII_USTRINGPARAM( "demo-sample.sxw" ) ) );
338     maEditSIGFileName.SetText( aNSSFolder + String( RTL_CONSTASCII_USTRINGPARAM( "demo-result.xml" ) ) );
339     maEditTokenName.SetText( aNSSFolder );
340 
341 #ifdef WNT
342 	maEditTokenName.SetText( String() );
343 	maEditTokenName.Disable();
344 	maCryptoCheckBox.Disable();
345 #endif
346 
347 }
348 
IMPL_LINK(MyWin,CryptoCheckBoxHdl,CheckBox *,EMPTYARG)349 IMPL_LINK( MyWin, CryptoCheckBoxHdl, CheckBox*, EMPTYARG )
350 {
351     if ( maCryptoCheckBox.IsChecked() )
352     {
353         maEditTokenName.Disable();
354         maFixedTextTokenName.Disable();
355     }
356     else
357     {
358         maEditTokenName.Enable();
359         maFixedTextTokenName.Enable();
360     }
361     return 1;
362 }
363 
IMPL_LINK(MyWin,DigitalSignaturesWithServiceHdl,Button *,EMPTYARG)364 IMPL_LINK( MyWin, DigitalSignaturesWithServiceHdl, Button*, EMPTYARG )
365 {
366     rtl::OUString aDocFileName = maEditDOCFileName.GetText();
367     uno::Reference < embed::XStorage > xStore = ::comphelper::OStorageHelper::GetStorageFromURL(
368             aDocFileName, embed::ElementModes::READWRITE, comphelper::getProcessServiceFactory() );
369 
370     uno::Reference< security::XDocumentDigitalSignatures > xD(
371         comphelper::getProcessServiceFactory()->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.security.DocumentDigitalSignatures" ) ) ), uno::UNO_QUERY );
372     if ( xD.is() )
373         xD->signDocumentContent( xStore, NULL );
374 
375 
376     return 0;
377 }
378 
IMPL_LINK(MyWin,VerifyDigitalSignaturesHdl,Button *,EMPTYARG)379 IMPL_LINK( MyWin, VerifyDigitalSignaturesHdl, Button*, EMPTYARG )
380 {
381     rtl::OUString aDocFileName = maEditDOCFileName.GetText();
382     uno::Reference < embed::XStorage > xStore = ::comphelper::OStorageHelper::GetStorageFromURL(
383             aDocFileName, embed::ElementModes::READWRITE, comphelper::getProcessServiceFactory() );
384 
385     uno::Reference< security::XDocumentDigitalSignatures > xD(
386         comphelper::getProcessServiceFactory()->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.security.DocumentDigitalSignatures" ) ) ), uno::UNO_QUERY );
387     if ( xD.is() )
388     {
389         uno::Sequence< security::DocumentSignatureInformation > aInfos = xD->verifyDocumentContentSignatures( xStore, NULL );
390         int nInfos = aInfos.getLength();
391         for ( int n = 0; n < nInfos; n++ )
392         {
393             security::DocumentSignatureInformation& rInf = aInfos[n];
394             String aText( RTL_CONSTASCII_USTRINGPARAM( "The document is signed by\n\n  " ) );
395             aText += String( rInf.Signer->getSubjectName() );
396             aText += String( RTL_CONSTASCII_USTRINGPARAM( "\n\n The signature is " ) );
397             if ( !rInf.SignatureIsValid )
398                 aText += String( RTL_CONSTASCII_USTRINGPARAM( "NOT " ) );
399             aText += String( RTL_CONSTASCII_USTRINGPARAM( "valid" ) );
400             InfoBox( this, aText ).Execute();
401         }
402 
403     }
404 
405 
406     return 0;
407 }
408 
409 
410 #ifdef TEST_IMPLEMENTATION_DIRECTLY
411 
IMPL_LINK(MyWin,DigitalSignaturesWithTokenHdl,Button *,EMPTYARG)412 IMPL_LINK( MyWin, DigitalSignaturesWithTokenHdl, Button*, EMPTYARG )
413 {
414     String aDocFileName = maEditDOCFileName.GetText();
415     String aTokenFileName = maEditTokenName.GetText();
416 
417     DigitalSignaturesDialog aSignaturesDialog( this, comphelper::getProcessServiceFactory(), SignatureModeDocumentContent, false );
418 
419     bool bInit = aSignaturesDialog.Init( aTokenFileName );
420     if ( !bInit )
421     {
422         ErrorBox( this, WB_OK, String( RTL_CONSTASCII_USTRINGPARAM( "Error initializing security context!" ) ) ).Execute();
423         return 0;
424     }
425 
426     uno::Reference < embed::XStorage > xStore = ::comphelper::OStorageHelper::GetStorageFromURL(
427             aDocFileName, embed::ElementModes::READWRITE, comphelper::getProcessServiceFactory() );
428 
429     aSignaturesDialog.SetStorage( xStore );
430 
431     aSignaturesDialog.Execute();
432 
433     return 0;
434 }
435 
IMPL_LINK(MyWin,SignButtonHdl,Button *,EMPTYARG)436 IMPL_LINK( MyWin, SignButtonHdl, Button*, EMPTYARG )
437 {
438 	String aXMLFileName = maEditXMLFileName.GetText();
439 	String aBINFileName = maEditBINFileName.GetText();
440 	String aSIGFileName = maEditSIGFileName.GetText();
441 
442 	String aTokenFileName;
443 	if ( !maCryptoCheckBox.IsChecked() )
444 	    aTokenFileName = maEditTokenName.GetText();
445 
446     XMLSignatureHelper aSignatureHelper( comphelper::getProcessServiceFactory() );
447     bool bInit = aSignatureHelper.Init( aTokenFileName );
448 
449     if ( !bInit )
450     {
451         ErrorBox( this, WB_OK, String( RTL_CONSTASCII_USTRINGPARAM( "Error initializing security context!" ) ) ).Execute();
452         return 0;
453     }
454 
455     uno::Reference< ::com::sun::star::security::XCertificate > xCertToUse;
456     CertificateChooser aChooser( this, aSignatureHelper.GetSecurityEnvironment(), SignatureInformations() );
457     if ( aChooser.Execute() )
458         xCertToUse = aChooser.GetSelectedCertificate();
459 
460     if ( !xCertToUse.is() )
461         return 0;
462 
463 
464     aSignatureHelper.StartMission();
465 
466     sal_Int32 nSecurityId = aSignatureHelper.GetNewSecurityId();
467 
468     aSignatureHelper.SetX509Certificate( nSecurityId, xCertToUse->getIssuerName(), bigIntegerToNumericString( xCertToUse->getSerialNumber() ) );
469 
470     aSignatureHelper.AddForSigning( nSecurityId, aXMLFileName, aXMLFileName, sal_False );
471 	aSignatureHelper.AddForSigning( nSecurityId, aBINFileName, aBINFileName, sal_True );
472 
473     SvFileStream* pStream = new SvFileStream( aSIGFileName, STREAM_WRITE );
474     SvLockBytesRef xLockBytes = new SvLockBytes( pStream, sal_True );
475  	uno::Reference< io::XOutputStream > xOutputStream = new utl::OOutputStreamHelper( xLockBytes );
476 	bool bDone = aSignatureHelper.CreateAndWriteSignature( xOutputStream );
477 
478 	aSignatureHelper.EndMission();
479 
480     if ( !bDone )
481     {
482         ErrorBox( this, WB_OK, String( RTL_CONSTASCII_USTRINGPARAM( "Error creating Signature!" ) ) ).Execute();
483     }
484     else
485     {
486         rtl::OUString aInfo( String( RTL_CONSTASCII_USTRINGPARAM( "Signature successfully created!\n\n" ) ) );
487         // aInfo += getSignatureInformationmations( aSignatureHelper.getAllSignatureInformation(), aSignatureHelper.GetSecurityEnvironment() );
488 
489 
490         InfoBox( this, aInfo ).Execute();
491     }
492 
493     // Check for more detailed results...
494 
495     return 0;
496 }
497 
IMPL_LINK(MyWin,VerifyButtonHdl,Button *,EMPTYARG)498 IMPL_LINK( MyWin, VerifyButtonHdl, Button*, EMPTYARG )
499 {
500     String aXMLFileName = maEditXMLFileName.GetText();
501     String aBINFileName = maEditBINFileName.GetText();
502     String aSIGFileName = maEditSIGFileName.GetText();
503 
504 	String aTokenFileName;
505 	if ( !maCryptoCheckBox.IsChecked() )
506 	    aTokenFileName = maEditTokenName.GetText();
507 
508     XMLSignatureHelper aSignatureHelper( comphelper::getProcessServiceFactory() );
509     bool bInit = aSignatureHelper.Init( aTokenFileName );
510 
511     if ( !bInit )
512     {
513         ErrorBox( this, WB_OK, String( RTL_CONSTASCII_USTRINGPARAM( "Error initializing security context!" ) ) ).Execute();
514         return 0;
515     }
516 
517     aSignatureHelper.SetStartVerifySignatureHdl( LINK( this, MyWin, StartVerifySignatureHdl ) );
518 
519     aSignatureHelper.StartMission();
520 
521     SvFileStream* pStream = new SvFileStream( aSIGFileName, STREAM_READ );
522     pStream->Seek( STREAM_SEEK_TO_END );
523     sal_uLong nBytes = pStream->Tell();
524     pStream->Seek( STREAM_SEEK_TO_BEGIN );
525     SvLockBytesRef xLockBytes = new SvLockBytes( pStream, sal_True );
526  	uno::Reference< io::XInputStream > xInputStream = new utl::OInputStreamHelper( xLockBytes, nBytes );
527 	bool bDone = aSignatureHelper.ReadAndVerifySignature( xInputStream );
528 	xInputStream->closeInput();
529 
530 	aSignatureHelper.EndMission();
531 
532     if ( !bDone )
533         ErrorBox( this, WB_OK, String( RTL_CONSTASCII_USTRINGPARAM( "Error in Signature!" ) ) ).Execute();
534     else
535         InfoBox( this, String( RTL_CONSTASCII_USTRINGPARAM( "Signatures verified without any problems!" ) ) ).Execute();
536 
537     return 0;
538 }
539 
IMPL_LINK(MyWin,StartVerifySignatureHdl,void *,EMPTYARG)540 IMPL_LINK( MyWin, StartVerifySignatureHdl, void*, EMPTYARG )
541 {
542     QueryBox aQueryBox( this, WB_YES_NO|WB_DEF_YES, String( RTL_CONSTASCII_USTRINGPARAM( "Found Signature - Verify?" ) ) );
543     return ( aQueryBox.Execute() == RET_YES ) ? 1 : 0;
544 }
545 
546 
547 #endif // #ifdef TEST_IMPLEMENTATION_DIRECTLY
548