diff options
Diffstat (limited to 'xmlsecurity/tools/demo')
-rw-r--r-- | xmlsecurity/tools/demo/JavaFlatFilter.java | 228 | ||||
-rw-r--r-- | xmlsecurity/tools/demo/makefile.mk | 161 | ||||
-rw-r--r-- | xmlsecurity/tools/demo/manifest | 1 | ||||
-rw-r--r-- | xmlsecurity/tools/demo/mozprofile.cxx | 111 | ||||
-rw-r--r-- | xmlsecurity/tools/demo/multisigdemo.cxx | 239 | ||||
-rw-r--r-- | xmlsecurity/tools/demo/performance.cxx | 1883 | ||||
-rw-r--r-- | xmlsecurity/tools/demo/readme.txt | 22 | ||||
-rw-r--r-- | xmlsecurity/tools/demo/signdemo.cxx | 160 | ||||
-rw-r--r-- | xmlsecurity/tools/demo/util.cxx | 114 | ||||
-rw-r--r-- | xmlsecurity/tools/demo/util.hxx | 53 | ||||
-rw-r--r-- | xmlsecurity/tools/demo/util2.cxx | 429 | ||||
-rw-r--r-- | xmlsecurity/tools/demo/verifydemo.cxx | 112 |
12 files changed, 3513 insertions, 0 deletions
diff --git a/xmlsecurity/tools/demo/JavaFlatFilter.java b/xmlsecurity/tools/demo/JavaFlatFilter.java new file mode 100644 index 000000000000..e0ebb79dc32f --- /dev/null +++ b/xmlsecurity/tools/demo/JavaFlatFilter.java @@ -0,0 +1,228 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: JavaFlatFilter.java,v $ + * $Revision: 1.4 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +package com.sun.star.xml.security.eval; + +import com.sun.star.registry.XRegistryKey; +import com.sun.star.comp.loader.FactoryHelper; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.xml.sax.InputSource; +import com.sun.star.xml.sax.XDocumentHandler; +import com.sun.star.xml.sax.XParser; +import com.sun.star.xml.sax.XDTDHandler; +import com.sun.star.xml.sax.XEntityResolver; +import com.sun.star.xml.sax.XErrorHandler; +import com.sun.star.xml.sax.XAttributeList; +import com.sun.star.lang.XSingleServiceFactory; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.lang.XTypeProvider; +import com.sun.star.lang.XServiceInfo; +import com.sun.star.lang.Locale; + +/* + * the JavaFlatFilter class is a pure java filter, which does nothing + * but forwarding the SAX events to the next document handler. + * The purpose of this class is to calculate the time consumed by + * the UNO C++/Java bridge during exporting/importing. + */ +public class JavaFlatFilter extends Object + implements XDocumentHandler, XParser, XTypeProvider, XServiceInfo +{ + XDocumentHandler m_xDocumentHandler; + + /* XDocumentHandler */ + public void startDocument() + throws com.sun.star.xml.sax.SAXException + { + m_xDocumentHandler.startDocument(); + } + + public void endDocument() + throws com.sun.star.xml.sax.SAXException + { + m_xDocumentHandler.endDocument(); + } + + public void startElement (String aName, com.sun.star.xml.sax.XAttributeList xAttribs ) + throws com.sun.star.xml.sax.SAXException + { + m_xDocumentHandler.startElement(aName, xAttribs); + } + + public void endElement ( String aName ) + throws com.sun.star.xml.sax.SAXException + { + m_xDocumentHandler.endElement(aName); + } + + public void characters ( String aChars ) + throws com.sun.star.xml.sax.SAXException + { + m_xDocumentHandler.characters(aChars); + } + + public void ignorableWhitespace ( String aWhitespaces ) + throws com.sun.star.xml.sax.SAXException + { + m_xDocumentHandler.ignorableWhitespace(aWhitespaces); + } + + public void processingInstruction ( String aTarget, String aData ) + throws com.sun.star.xml.sax.SAXException + { + m_xDocumentHandler.processingInstruction(aTarget, aData); + } + + public void setDocumentLocator (com.sun.star.xml.sax.XLocator xLocator ) + throws com.sun.star.xml.sax.SAXException + { + m_xDocumentHandler.setDocumentLocator(xLocator); + } + + /* XParser */ + public void parseStream(InputSource strucInputSource) + { + } + + public void setDocumentHandler(XDocumentHandler xDocumentHandler) + { + m_xDocumentHandler = xDocumentHandler; + } + + public void setDTDHandler(XDTDHandler xHandler) + { + } + + public void setEntityResolver(XEntityResolver xResolver) + { + } + + public void setErrorHandler(XErrorHandler xHandler) + { + } + + public void setLocale(Locale locale) + { + } + + /* + * XTypeProvider implementation + * maintain a static implementation id for all instances of JavaFlatFilter + * initialized by the first call to getImplementationId() + */ + protected static byte[] _implementationId; + public com.sun.star.uno.Type[] getTypes() + { + com.sun.star.uno.Type[] retValue = new com.sun.star.uno.Type[4]; + + /* + * instantiate Type instances for each interface you support and add them to Type[] array + * this object implements XServiceInfo, XTypeProvider and XSignFilter + */ + retValue[0]= new com.sun.star.uno.Type( XServiceInfo.class); + retValue[1]= new com.sun.star.uno.Type( XTypeProvider.class); + retValue[2]= new com.sun.star.uno.Type( XDocumentHandler.class); + retValue[3]= new com.sun.star.uno.Type( XParser.class); + + /* + * XInterface is not needed for Java components, the UnoRuntime does its job + */ + + return retValue; + } + + synchronized public byte[] getImplementationId() + { + if (_implementationId == null) { + _implementationId= new byte[16]; + int hash = hashCode(); // hashDode of this object + _implementationId[0] = (byte)(hash & 0xff); + _implementationId[1] = (byte)((hash >>> 8) & 0xff); + _implementationId[2] = (byte)((hash >>> 16) & 0xff); + _implementationId[3] = (byte)((hash >>>24) & 0xff); + } + return _implementationId; + } + + + /* + * XServiceInfo implementation + * hold the service name in a private static member variable of the class + */ + protected static final String __serviceName = "com.sun.star.xml.crypto.eval.JavaFlatFilter"; + public String getImplementationName( ) + { + return getClass().getName(); + } + + public boolean supportsService(String serviceName) + { + boolean rc = false; + + if ( serviceName.equals( __serviceName)) + { + rc = true; + } + + return rc; + } + + public String[] getSupportedServiceNames( ) + { + String[] retValue= new String[0]; + retValue[0]= __serviceName; + return retValue; + } + + /* static __getServiceFactory() implementation */ + public static XSingleServiceFactory __getServiceFactory(String implName, + XMultiServiceFactory multiFactory, + com.sun.star.registry.XRegistryKey regKey) + { + com.sun.star.lang.XSingleServiceFactory xSingleServiceFactory = null; + if (implName.equals( JavaFlatFilter.class.getName()) ) + { + xSingleServiceFactory = FactoryHelper.getServiceFactory( JavaFlatFilter.class, + JavaFlatFilter.__serviceName, + multiFactory, + regKey); + } + + return xSingleServiceFactory; + } + + /* static __writeRegistryServiceInfo implementation */ + public static boolean __writeRegistryServiceInfo(XRegistryKey regKey) + { + return FactoryHelper.writeRegistryServiceInfo( JavaFlatFilter.class.getName(), + __serviceName, + regKey); + } +} diff --git a/xmlsecurity/tools/demo/makefile.mk b/xmlsecurity/tools/demo/makefile.mk new file mode 100644 index 000000000000..9789bd93ee97 --- /dev/null +++ b/xmlsecurity/tools/demo/makefile.mk @@ -0,0 +1,161 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.14 $ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +PRJ=..$/.. + +PRJNAME=xmlsecurity +TARGET=demo +ENABLE_EXCEPTIONS=TRUE +NO_BSYMBOLIC=TRUE +LIBTARGET=NO + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk +.INCLUDE : $(PRJ)$/util$/target.pmk + +CDEFS += -DXMLSEC_CRYPTO_NSS -DXMLSEC_NO_XSLT + +# --- Files -------------------------------------------------------- + +SHARE_LIBS = \ + $(CPPULIB) \ + $(CPPUHELPERLIB) \ + $(SALLIB) \ + $(UCBHELPERLIB) \ + $(UNOTOOLSLIB) \ + $(TOOLSLIB) \ + $(XMLOFFLIB) \ + $(LIBXML2LIB) \ + $(NSS3LIB) \ + $(NSPR4LIB) \ + $(XMLSECLIB) \ + $(COMPHELPERLIB) + +.IF "$(CRYPTO_ENGINE)" == "mscrypto" +SHARE_LIBS+= $(XMLSECLIB-MS) +.ELSE +SHARE_LIBS+= $(XMLSECLIB-NSS) +.ENDIF + + + +# HACK: Use SLO for demo directly... +SHARE_OBJS = \ + $(OBJ)$/util.obj \ + $(OBJ)$/util2.obj \ + $(SLO)$/biginteger.obj \ + $(SLO)$/baseencoding.obj \ + $(SLO)/xmlsignaturehelper.obj \ + $(SLO)/xmlsignaturehelper2.obj \ + $(SLO)/xsecctl.obj \ + $(SLO)/xsecparser.obj \ + $(SLO)/xsecsign.obj \ + $(SLO)/xsecverify.obj + +# +# ---------- signdemo ---------- +# +APP1TARGET=signdemo +APP1DEPN=makefile.mk +APP1STDLIBS+=$(SHARE_LIBS) +APP1OBJS= $(SHARE_OBJS) $(OBJ)$/signdemo.obj + +# +# ---------- verifydemo ---------- +# +APP2TARGET=verifydemo +APP2DEPN=makefile.mk +APP2STDLIBS+=$(SHARE_LIBS) +APP2OBJS= $(SHARE_OBJS) $(OBJ)$/verifydemo.obj + +# +# ---------- multisigdemo ---------- +# +APP3TARGET=multisigdemo +APP3DEPN=makefile.mk +APP3STDLIBS+=$(SHARE_LIBS) +APP3OBJS= $(SHARE_OBJS) $(OBJ)$/multisigdemo.obj + +# +# ---------- mozprofile ---------- +# +APP4TARGET=mozprofile +APP4DEPN=makefile.mk +APP4STDLIBS+=$(SHARE_LIBS) +APP4OBJS= $(SHARE_OBJS) $(OBJ)$/mozprofile.obj + +# +# ---------- performance ---------- +# +APP5TARGET=performance +APP5DEPN=makefile.mk +APP5STDLIBS+=$(SHARE_LIBS) +APP5OBJS= $(OBJ)$/util.obj $(OBJ)$/performance.obj + +# +# ---------- jflatfilter ---------- +# +PACKAGE= com$/sun$/star$/xml$/security$/eval +JARFILES= sandbox.jar ridl.jar jurt.jar unoil.jar juh.jar +JAVAFILES:= $(shell @ls *.java) +JAVACLASSFILES= $(CLASSDIR)$/$(PACKAGE)$/JavaFlatFilter.class +JARCLASSDIRS= $(PACKAGE) +JARTARGET= jflatfilter.jar +JARCOMPRESS= TRUE + + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk + +ALLTAR : $(BIN)$/demo.rdb + +$(JAVACLASSFILES) : $(JAVAFILES) + +REGISTERLIBS= \ + dynamicloader.uno$(DLLPOST) \ + namingservice.uno$(DLLPOST) \ + bootstrap.uno$(DLLPOST) \ + sax.uno$(DLLPOST) \ + $(DLLPRE)mozab2$(DLLPOST) + +$(BIN)$/demo.rdb: \ + makefile.mk \ + $(foreach,i,$(REGISTERLIBS) $(SOLARSHAREDBIN)$/$(i)) + -rm -f $@ $(BIN)$/regcomp.rdb $(BIN)$/demo.tmp + $(REGCOMP) -register -r $(BIN)$/demo.tmp -c "$(strip $(REGISTERLIBS))" + $(REGCOMP) -register -r $(BIN)$/demo.tmp -c $(DLLPRE)xsec_fw$(DLLPOST) + $(REGCOMP) -register -r $(BIN)$/demo.tmp -c $(DLLPRE)xsec_xmlsec$(DLLPOST) + $(REGMERGE) $(BIN)$/demo.tmp / $(SOLARBINDIR)/types.rdb + mv $(BIN)$/demo.tmp $@ + + diff --git a/xmlsecurity/tools/demo/manifest b/xmlsecurity/tools/demo/manifest new file mode 100644 index 000000000000..93cb7d908467 --- /dev/null +++ b/xmlsecurity/tools/demo/manifest @@ -0,0 +1 @@ +RegistrationClassName: com.sun.star.xml.security.eval.JavaFlatFilter diff --git a/xmlsecurity/tools/demo/mozprofile.cxx b/xmlsecurity/tools/demo/mozprofile.cxx new file mode 100644 index 000000000000..e16e4b13020d --- /dev/null +++ b/xmlsecurity/tools/demo/mozprofile.cxx @@ -0,0 +1,111 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: mozprofile.cxx,v $ + * $Revision: 1.5 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_xmlsecurity.hxx" + +#include "util.hxx" + +#include <stdio.h> +#include <tools/date.hxx> +#include <tools/time.hxx> +#include <cppuhelper/servicefactory.hxx> + +#include <xmlsecurity/biginteger.hxx> +#include <xmlsecurity/xmlsignaturehelper.hxx> +#include <com/sun/star/mozilla/XMozillaBootstrap.hpp> + +using namespace ::com::sun::star; + +int SAL_CALL main( int argc, char **argv ) +{ + fprintf( stdout, "\nTesting Mozilla Profile Detection...\n\nOpenOffice.org will use the first detected profile.\nResults might be different when started in OOo program folder!\n" ) ; + + uno::Reference< lang::XMultiServiceFactory > xMSF = CreateDemoServiceFactory(); + if ( !xMSF.is() ) + { + fprintf( stdout, "\n\nERROR: Can't create Service Factory\n" ); + exit (-1); + } + + uno::Reference<mozilla::XMozillaBootstrap> xMozillaBootstrap( xMSF->createInstance(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.mozilla.MozillaBootstrap" ) ) ), uno::UNO_QUERY ); + if ( !xMozillaBootstrap.is() ) + { + fprintf( stdout, "\n\nERROR: Can't create Mozilla Bootstrap Service\n" ); + exit (-1); + } + + int nProducts = 4; + mozilla::MozillaProductType productTypes[4] = { mozilla::MozillaProductType_Thunderbird, mozilla::MozillaProductType_Mozilla, mozilla::MozillaProductType_Firefox, mozilla::MozillaProductType_Default }; + for ( int i = 0; i < nProducts; i++) + { + if ( i == 0 ) + fprintf( stdout, "\nThunderbird: " ); + else if ( i == 1 ) + fprintf( stdout, "\nMozilla: " ); + else if ( i == 2 ) + fprintf( stdout, "\nFireFox: " ); + else + fprintf( stdout, "\nDefault: " ); + + ::rtl::OUString profile = xMozillaBootstrap->getDefaultProfile(productTypes[i]); + if ( profile.getLength() ) + { + ::rtl::OUString profilepath = xMozillaBootstrap->getProfilePath(productTypes[i],profile); + fprintf( stdout, "Name=%s, Path=%s", rtl::OUStringToOString( profile , RTL_TEXTENCODING_ASCII_US ).getStr(), rtl::OUStringToOString( profilepath , RTL_TEXTENCODING_ASCII_US ).getStr() ); + } + else + { + fprintf( stdout, "NOT FOUND" ); + } + } + + /* + * creates a signature helper + */ + XMLSignatureHelper aSignatureHelper( xMSF ); + + /* + * creates a security context. + */ + rtl::OUString aCryptoToken; + bool bInit = aSignatureHelper.Init( aCryptoToken ); + if ( !bInit ) + { + fprintf( stdout, "\n\nERROR: Unable to initialize security environment.\n\n" ); + } + else + { + fprintf( stdout, "\n\nSecurity environment can be initialized successfully.\n\n" ); + } + + return 0; +} + diff --git a/xmlsecurity/tools/demo/multisigdemo.cxx b/xmlsecurity/tools/demo/multisigdemo.cxx new file mode 100644 index 000000000000..4ca862ce14ef --- /dev/null +++ b/xmlsecurity/tools/demo/multisigdemo.cxx @@ -0,0 +1,239 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: multisigdemo.cxx,v $ + * $Revision: 1.9 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_xmlsecurity.hxx" + +#include <stdio.h> +#include "util.hxx" + +#include <rtl/ustring.hxx> +#include <cppuhelper/servicefactory.hxx> + +#include <xmlsecurity/biginteger.hxx> +#include <xmlsecurity/xmlsignaturehelper.hxx> +#include "xmlsecurity/baseencoding.hxx" +#include <tools/date.hxx> +#include <tools/time.hxx> + +using namespace ::com::sun::star; + +long denyVerifyHandler( void *, void * ) +{ + return 0; +} + +long startVerifyHandler( void *, void * ) +{ + return QueryVerifySignature(); +} + +int SAL_CALL main( int argc, char **argv ) +{ + if( argc < 5 ) + { + fprintf( stderr, "Usage: %s <signature file 1> <signature file 2> <xml stream file> <binary stream file> [<cryptoken>]\n" , argv[0] ) ; + return -1 ; + } + + uno::Reference< lang::XMultiServiceFactory > xMSF = CreateDemoServiceFactory(); + + rtl::OUString aSIGFileName = rtl::OUString::createFromAscii(argv[1]); + rtl::OUString aSIGFileName2 = rtl::OUString::createFromAscii(argv[2]); + rtl::OUString aXMLFileName = rtl::OUString::createFromAscii(argv[3]); + rtl::OUString aBINFileName = rtl::OUString::createFromAscii(argv[4]); + rtl::OUString aCryptoToken; + if ( argc >= 7 ) + aCryptoToken = rtl::OUString::createFromAscii(argv[6]); + + sal_Int32 nSecurityId; + uno::Reference< io::XOutputStream > xOutputStream; + uno::Reference< io::XInputStream > xInputStream; + bool bDone; + SignatureInformations signatureInformations; + uno::Reference< ::com::sun::star::xml::sax::XDocumentHandler> xDocumentHandler; + + // -------- START ------- + + XMLSignatureHelper aSignatureHelper( xMSF ); + + bool bInit = aSignatureHelper.Init( aCryptoToken ); + if ( !bInit ) + { + fprintf( stderr, "Error initializing security context!\n" ); + return -1; + } + + fprintf( stdout, "\n\nTEST MISSION 1: Create the first signature file\n"); + + aSignatureHelper.StartMission(); + + /* + * select a private key certificate + */ + uno::Reference< xml::crypto::XSecurityEnvironment > xSecurityEnvironment = aSignatureHelper.GetSecurityEnvironment(); + uno::Sequence< uno::Reference< ::com::sun::star::security::XCertificate > > xPersonalCerts = xSecurityEnvironment->getPersonalCertificates() ; + + fprintf( stdout, "\nPlease select two certificates:\n" ); + + for ( int nSig = 0; nSig < 2; nSig++ ) + { + // New security ID for signature... + nSecurityId = aSignatureHelper.GetNewSecurityId(); + + // Select certificate... + uno::Reference< ::com::sun::star::security::XCertificate > xPersonalCert = getCertificateFromEnvironment( xSecurityEnvironment, true ); + aSignatureHelper.SetX509Certificate( + nSecurityId, xPersonalCert->getIssuerName(), + bigIntegerToNumericString( xPersonalCert->getSerialNumber()), + baseEncode(xPersonalCert->getEncoded(), BASE64)); + aSignatureHelper.AddForSigning( nSecurityId, aXMLFileName, aXMLFileName, sal_False ); + aSignatureHelper.AddForSigning( nSecurityId, aBINFileName, aBINFileName, sal_True ); + aSignatureHelper.SetDateTime( nSecurityId, Date(), Time() ); + } + /* + * creates signature + */ + xOutputStream = OpenOutputStream( aSIGFileName ); + bDone = aSignatureHelper.CreateAndWriteSignature( xOutputStream ); + if ( !bDone ) + fprintf( stderr, "\nSTATUS MISSION 1: Error creating Signature!\n" ); + else + fprintf( stdout, "\nSTATUS MISSION 1: Signature successfully created!\n" ); + + aSignatureHelper.EndMission(); + + + fprintf( stdout, "\n\nTEST MISSION 2: Transfer the second signature to a new signature file\n"); + + /* + * You can use an uninitialized SignatureHelper to perform this mission. + */ + + /* + * configures the start-verify handler. Don't need to verify for transfering... + */ + aSignatureHelper.SetStartVerifySignatureHdl( Link( NULL, denyVerifyHandler ) ); + aSignatureHelper.StartMission(); + + xInputStream = OpenInputStream( aSIGFileName ); + bDone = aSignatureHelper.ReadAndVerifySignature( xInputStream ); + xInputStream->closeInput(); + + if ( !bDone ) + fprintf( stderr, "\nSTATUS MISSION 2: Error in reading Signature!\n" ); + else + fprintf( stdout, "\nSTATUS MISSION 2: Signature successfully transfered!\n" ); + + /* + * get all signature information + */ + signatureInformations = aSignatureHelper.GetSignatureInformations(); + + /* + * write the first signature into the second signature file. + */ + + xOutputStream = OpenOutputStream( aSIGFileName2 ); + xDocumentHandler = aSignatureHelper.CreateDocumentHandlerWithHeader( xOutputStream); + aSignatureHelper.ExportSignature( xDocumentHandler, signatureInformations[1]); + aSignatureHelper.CloseDocumentHandler( xDocumentHandler); + aSignatureHelper.EndMission(); + + fprintf( stdout, "\n\nTEST MISSION 3: Insert a new signature to the first signature file\n"); + + aSignatureHelper.StartMission(); + + nSecurityId = aSignatureHelper.GetNewSecurityId(); + + // Select certificate... + uno::Reference< ::com::sun::star::security::XCertificate > xPersonalCert = getCertificateFromEnvironment( xSecurityEnvironment, true ); + aSignatureHelper.SetX509Certificate( + nSecurityId, xPersonalCert->getIssuerName(), + bigIntegerToNumericString( xPersonalCert->getSerialNumber()), + baseEncode(xPersonalCert->getEncoded(), BASE64)); + aSignatureHelper.AddForSigning( nSecurityId, aXMLFileName, aXMLFileName, sal_False ); + aSignatureHelper.AddForSigning( nSecurityId, aBINFileName, aBINFileName, sal_True ); + aSignatureHelper.SetDateTime( nSecurityId, Date(), Time() ); + + + xOutputStream = OpenOutputStream( aSIGFileName ); + xDocumentHandler = aSignatureHelper.CreateDocumentHandlerWithHeader( xOutputStream); + + aSignatureHelper.ExportSignature( xDocumentHandler, signatureInformations[0]); + bDone = aSignatureHelper.CreateAndWriteSignature( xDocumentHandler ); + aSignatureHelper.ExportSignature( xDocumentHandler, signatureInformations[1]); + aSignatureHelper.CloseDocumentHandler( xDocumentHandler); + + if ( !bDone ) + fprintf( stderr, "\nSTATUS MISSION 3: Error creating Signature!\n" ); + else + fprintf( stdout, "\nSTATUS MISSION 3: Signature successfully created!\n" ); + + aSignatureHelper.EndMission(); + + fprintf( stdout, "\n\nTEST MISSION 4 : Verify the first signature file\n"); + + aSignatureHelper.SetStartVerifySignatureHdl( Link( NULL, startVerifyHandler ) ); + + aSignatureHelper.StartMission(); + + xInputStream = OpenInputStream( aSIGFileName ); + bDone = aSignatureHelper.ReadAndVerifySignature( xInputStream ); + xInputStream->closeInput(); + + if ( !bDone ) + fprintf( stderr, "\nSTATUS MISSION 4: Error verifying Signatures!\n" ); + else + fprintf( stdout, "\nSTATUS MISSION 4: All choosen Signatures veryfied successfully!\n" ); + + aSignatureHelper.EndMission(); + + QueryPrintSignatureDetails( aSignatureHelper.GetSignatureInformations(), aSignatureHelper.GetSecurityEnvironment() ); + + fprintf( stdout, "\n\nTEST MISSION 5: Verify the second signature file\n"); + + aSignatureHelper.StartMission(); + + xInputStream = OpenInputStream( aSIGFileName2 ); + bDone = aSignatureHelper.ReadAndVerifySignature( xInputStream ); + xInputStream->closeInput(); + + if ( !bDone ) + fprintf( stderr, "\nSTATUS MISSION 5: Error verifying Signatures!\n" ); + else + fprintf( stdout, "\nSTATUS MISSION 5: All choosen Signatures veryfied successfully!\n" ); + + aSignatureHelper.EndMission(); + + QueryPrintSignatureDetails( aSignatureHelper.GetSignatureInformations(), aSignatureHelper.GetSecurityEnvironment() ); + + return 0; +} diff --git a/xmlsecurity/tools/demo/performance.cxx b/xmlsecurity/tools/demo/performance.cxx new file mode 100644 index 000000000000..e9097bb8fa59 --- /dev/null +++ b/xmlsecurity/tools/demo/performance.cxx @@ -0,0 +1,1883 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: performance.cxx,v $ + * $Revision: 1.5 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_xmlsecurity.hxx" + +#include <stdio.h> +#include <string.h> + +#include <rtl/ustring.hxx> +#include <cppuhelper/bootstrap.hxx> +#include <cppuhelper/servicefactory.hxx> +#include <com/sun/star/bridge/XUnoUrlResolver.hpp> +#include <com/sun/star/registry/XImplementationRegistration.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/lang/XMultiComponentFactory.hpp> + +#include <comphelper/processfactory.hxx> + +#include <iostream> +#include <fstream> + +#include <util.hxx> + +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/io/XOutputStream.hpp> +#include <com/sun/star/io/XInputStream.hpp> +#include <com/sun/star/xml/sax/XParser.hpp> +#include <com/sun/star/xml/sax/XDocumentHandler.hpp> +#include <com/sun/star/xml/sax/XAttributeList.hpp> +#include <cppuhelper/implbase4.hxx> + +#include <com/sun/star/xml/crypto/sax/XSignatureCreationResultListener.hpp> +#include <com/sun/star/xml/crypto/sax/XSignatureVerifyResultListener.hpp> +#include <com/sun/star/xml/crypto/sax/XSAXEventKeeperStatusChangeListener.hpp> +#include <com/sun/star/xml/crypto/sax/XSecuritySAXEventKeeper.hpp> +#include <com/sun/star/xml/crypto/sax/XReferenceResolvedListener.hpp> +#include <com/sun/star/xml/crypto/XXMLSignature.hpp> +#include <com/sun/star/xml/wrapper/XXMLDocumentWrapper.hpp> +#include <com/sun/star/xml/csax/XMLAttribute.hpp> +#include <com/sun/star/xml/crypto/XSEInitializer.hpp> +#include <com/sun/star/xml/crypto/SecurityOperationStatus.hpp> +#include <com/sun/star/io/XActiveDataSource.hpp> +#include <com/sun/star/lang/XInitialization.hpp> +#include <com/sun/star/xml/crypto/sax/XKeyCollector.hpp> +#include <com/sun/star/xml/crypto/sax/ElementMarkPriority.hpp> +#include <com/sun/star/xml/crypto/sax/XReferenceResolvedBroadcaster.hpp> +#include <com/sun/star/xml/crypto/sax/XMissionTaker.hpp> +#include <com/sun/star/xml/crypto/sax/XBlockerMonitor.hpp> +#include <com/sun/star/xml/crypto/sax/XSignatureCreationResultBroadcaster.hpp> +#include <com/sun/star/xml/crypto/sax/XSignatureVerifyResultBroadcaster.hpp> +#include <com/sun/star/xml/crypto/sax/XReferenceCollector.hpp> +#include <com/sun/star/xml/crypto/sax/XSAXEventKeeperStatusChangeBroadcaster.hpp> +#include <com/sun/star/xml/wrapper/XXMLDocumentWrapper.hpp> + +#include <xmloff/attrlist.hxx> + +//#include <malloc.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +/* + * Can not build under solaris. + * Delete the memory.h including by AF +#include <memory.h> +*/ + +#include <sys/types.h> +#include <sys/stat.h> +#include <osl/time.h> + + + +#ifndef INCLUDED_VECTOR +#include <vector> +#define INCLUDED_VECTOR +#endif + +#ifndef INCLUDED_STACK +#include <stack> +#define INCLUDED_STACK +#endif + +/* xml security framework components */ +#define SIGNATURECREATOR_COMPONENT "com.sun.star.xml.crypto.sax.SignatureCreator" +#define SIGNATUREVERIFIER_COMPONENT "com.sun.star.xml.crypto.sax.SignatureVerifier" +#define JAVAFLATFILTER_COMPONENT "com.sun.star.xml.crypto.eval.JavaFlatFilter" +#define SAXEVENTKEEPER_COMPONENT "com.sun.star.xml.crypto.sax.SAXEventKeeper" + +/* java based bridge components */ +#define SEINITIALIZER_JAVA_COMPONENT "com.sun.star.xml.security.bridge.jxsec.SEInitializer_JxsecImpl" +#define XMLSIGNATURE_JAVA_COMPONENT "com.sun.star.xml.security.bridge.jxsec.XMLSignature_JxsecImpl" +#define XMLDOCUMENTWRAPPER_JAVA_COMPONENT "com.sun.star.xml.security.bridge.jxsec.XMLDocumentWrapper_JxsecImpl" + +/* c based bridge components */ +#define SEINITIALIZER_C_COMPONENT "com.sun.star.xml.crypto.SEInitializer" +#define XMLSIGNATURE_C_COMPONENT "com.sun.star.xml.crypto.XMLSignature" +#define XMLDOCUMENT_C_COMPONENT "com.sun.star.xml.wrapper.XMLDocumentWrapper" + +/* security related elements and attributes */ +#define SIGNATURE_STR "Signature" +#define REFERENCE_STR "Reference" +#define SIGNEDINFO_STR "SignedInfo" +#define KEYINFO_STR "KeyInfo" +#define KEYVALUE_STR "KeyValue" +#define KEYNAME_STR "KeyName" +#define X509DATA_STR "X509Data" +#define ENCRYPTEDKEY_STR "EncryptedKey" +#define RETRIEVALMETHOD_STR "RetrievalMethod" +#define OTHER_ELEMENT_STR "OTHER_ELEMENT_STR" +#define REFNUM_ATTR_STR "refNum" +#define URI_ATTR_STR "URI" + + +#define RTL_ASCII_USTRINGPARAM( asciiStr ) asciiStr, strlen( asciiStr ), RTL_TEXTENCODING_ASCII_US + +namespace cssu = com::sun::star::uno; +namespace cssl = com::sun::star::lang; +namespace cssb = com::sun::star::beans; +namespace cssi = com::sun::star::io; +namespace cssxc = com::sun::star::xml::crypto; +namespace cssxs = com::sun::star::xml::sax; +namespace cssxw = com::sun::star::xml::wrapper; +namespace cssxcsax = com::sun::star::xml::csax; + + +using namespace ::com::sun::star; + + +class XSecTester; + +/* + * The XSecTester class is a C++ version of SecurityFramworkController.java + * + */ + +class SecurityEntity +{ +private: + static int m_nNextSecurityId; + rtl::OUString m_ouKeyURI; + +protected: + com::sun::star::uno::Reference< + com::sun::star::lang::XMultiServiceFactory > mxMSF; + + com::sun::star::uno::Reference< + com::sun::star::xml::crypto::sax::XReferenceResolvedListener > + m_xReferenceListener; + + com::sun::star::uno::Reference< + com::sun::star::xml::crypto::sax::XSecuritySAXEventKeeper > + m_xSAXEventKeeper; + + com::sun::star::uno::Reference< + com::sun::star::xml::crypto::XXMLSecurityContext > + m_xXMLSecurityContext; + + com::sun::star::uno::Reference< + com::sun::star::xml::crypto::XXMLSignature > + m_xXMLSignature; + + int m_nSecurityId; + +private: + int getNextSecurityId() const; + +protected: + SecurityEntity( + const com::sun::star::uno::Reference< + com::sun::star::xml::crypto::sax::XSecuritySAXEventKeeper >& + xSAXEventKeeper, + const com::sun::star::uno::Reference< + com::sun::star::xml::crypto::XXMLSecurityContext >& + xXMLSecurityContext, + const com::sun::star::uno::Reference< + com::sun::star::xml::crypto::XXMLSignature >& + xXMLSignature, + const com::sun::star::uno::Reference< + com::sun::star::lang::XMultiServiceFactory >& + rsMSF); + +public: + void setKeyId(int nId); + + int getSecurityId() const; + + com::sun::star::uno::Reference< + com::sun::star::xml::crypto::sax::XReferenceResolvedListener > + getReferenceListener() const; + + bool setKey( const rtl::OUString& ouUri, bool bIsExporting ); + + void setKeyURI(const rtl::OUString& ouUri); + + bool endMission(); +}; + + +class SignatureEntity : public SecurityEntity +{ +private: + std::vector< rtl::OUString > m_vReferenceIds; + int m_nSignatureElementCollectorId; + + bool hasReference(const rtl::OUString& ouUri) const; + +public: + SignatureEntity( + const com::sun::star::uno::Reference< + com::sun::star::xml::crypto::sax::XSecuritySAXEventKeeper >& + xSAXEventKeeper, + bool bIsExporting, + XSecTester* pListener, + const com::sun::star::uno::Reference< + com::sun::star::xml::crypto::XXMLSecurityContext >& + xXMLSecurityContext, + const com::sun::star::uno::Reference< + com::sun::star::xml::crypto::XXMLSignature >& + xXMLSignature, + const com::sun::star::uno::Reference< + com::sun::star::lang::XMultiServiceFactory >& + rsMSF); + ~SignatureEntity(){}; + + void setReferenceNumber() const; + bool setReference( const rtl::OUString& ouUri, bool bIsExporting ) const; + void addReferenceURI( const rtl::OUString& ouUri ); +}; + +struct AncestorEvent +{ + AncestorEvent( sal_Int32 nAttrNum ):aAttributeList(nAttrNum){}; + + bool bIsStartElement; + rtl::OUString ouName; + + com::sun::star::uno::Sequence< + com::sun::star::xml::csax::XMLAttribute > + aAttributeList; +}; + +class XSecTester : public cppu::WeakImplHelper4 +< + com::sun::star::xml::crypto::sax::XSignatureCreationResultListener, + com::sun::star::xml::crypto::sax::XSignatureVerifyResultListener, + com::sun::star::xml::crypto::sax::XSAXEventKeeperStatusChangeListener, + com::sun::star::xml::sax::XDocumentHandler +> +{ +private: + com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory > mxMSF; + + sal_Int32 m_nTotalSignatureNumber; + sal_Int32 m_nSuccessfulSignatureNumber; + + com::sun::star::uno::Reference< + com::sun::star::xml::sax::XDocumentHandler > + m_xExportHandler; + + com::sun::star::uno::Reference< + com::sun::star::xml::crypto::sax::XSecuritySAXEventKeeper > + m_xSAXEventKeeper; + + com::sun::star::uno::Reference< + com::sun::star::xml::wrapper::XXMLDocumentWrapper > + m_xXMLDocumentWrapper; + + com::sun::star::uno::Reference< + com::sun::star::xml::sax::XDocumentHandler > + m_xOutputHandler; + + com::sun::star::uno::Reference< + com::sun::star::xml::sax::XParser > + m_xSaxParser; + + std::stack< void* > m_stCurrentPath; + std::stack< bool > m_stCurrentPathType; + + std::vector< AncestorEvent* > m_vAncestorEvents; + std::vector< SignatureEntity* > m_vSignatureList; + + std::vector< rtl::OUString > m_vUnsolvedReferenceURIs; + std::vector< int > m_vUnsolvedReferenceKeeperIds; + std::vector< int > m_vUnsolvedReferenceRefNums; + + bool m_bIsExporting; + bool m_bIsBlocking; + + bool m_bIsInsideCollectedElement; + bool m_bIsSAXEventKeeperOnTheSAXChain; + + com::sun::star::uno::Reference< + com::sun::star::xml::crypto::XXMLSecurityContext > + m_xXMLSecurityContext; + + com::sun::star::uno::Reference< + com::sun::star::xml::crypto::XXMLSignature > + m_xXMLSignature; + + rtl::OUString m_ouJavaCryptokenDir; + rtl::OUString m_ouCCryptokenDir; + rtl::OUString m_ouXMLDocumentWrapperComponentName; + +private: + com::sun::star::uno::Reference< + com::sun::star::io::XOutputStream > + createOutputStream( const rtl::OUString& ouFile ); + + rtl::OUString parseFile( + const rtl::OUString& ouInputFileName, + const rtl::OUString& ouOutputFileName, + bool bIsExporting, + bool bIsJavaBased); + + void changeOutput(); + + bool foundSecurityRelated(); + + void findKeyOrReference(SecurityEntity* pSecurityEntity, const rtl::OUString& ouUri, bool bIsFindKey); + + bool checkSecurityElement( + const rtl::OUString& ouLocalName, + const com::sun::star::uno::Reference< + com::sun::star::xml::sax::XAttributeList>& xAttribs); + + void checkReference( + const rtl::OUString& ouLocalName, + const com::sun::star::uno::Reference< + com::sun::star::xml::sax::XAttributeList>& xAttribs, + const rtl::OUString& ouId); + + void endMission(); + + void addStartAncestorEvent( + const rtl::OUString& ouName, + const com::sun::star::uno::Reference< + com::sun::star::xml::sax::XAttributeList>& xAttribs); + + void addEndAncestorEvent( const rtl::OUString& ouName ); + + void flushAncestorEvents( + const com::sun::star::uno::Reference< + com::sun::star::xml::sax::XDocumentHandler >& xDocumentHandler); + + void XSecTester::sendAncestorStartElementEvent( + const rtl::OUString& ouName, + const com::sun::star::uno::Sequence< + com::sun::star::xml::csax::XMLAttribute >& xAttrList, + const com::sun::star::uno::Reference< + com::sun::star::xml::sax::XDocumentHandler >& xDocumentHandler) const; + + void XSecTester::sendAncestorEndElementEvent( + const rtl::OUString& ouName, + const com::sun::star::uno::Reference< + com::sun::star::xml::sax::XDocumentHandler >& xDocumentHandler) const; + + std::vector< AncestorEvent* >::const_iterator XSecTester::checkAncestorStartElementEvent( + const std::vector< AncestorEvent* >::const_iterator& ii, + const com::sun::star::uno::Reference< + com::sun::star::xml::sax::XDocumentHandler >& xDocumentHandler) const; + +public: + XSecTester(const com::sun::star::uno::Reference< + com::sun::star::lang::XMultiServiceFactory >& rxMSF) + :mxMSF( rxMSF ){}; + virtual ~XSecTester(){}; + + /* XSignatureCreationResultListener */ + virtual void SAL_CALL signatureCreated( + sal_Int32 securityId, + com::sun::star::xml::crypto::SecurityOperationStatus creationResult ) + throw (com::sun::star::uno::RuntimeException); + + /* XSignatureVerifyResultListener */ + virtual void SAL_CALL signatureVerified( + sal_Int32 securityId, + com::sun::star::xml::crypto::SecurityOperationStatus verifyResult ) + throw (com::sun::star::uno::RuntimeException); + + /* XSAXEventKeeperStatusChangeListener */ + virtual void SAL_CALL blockingStatusChanged( sal_Bool isBlocking ) + throw (com::sun::star::uno::RuntimeException); + virtual void SAL_CALL collectionStatusChanged( + sal_Bool isInsideCollectedElement ) + throw (com::sun::star::uno::RuntimeException); + virtual void SAL_CALL bufferStatusChanged( sal_Bool isBufferEmpty ) + throw (com::sun::star::uno::RuntimeException); + + /* XXMLSecTester */ + virtual rtl::OUString SAL_CALL transfer_without_sec( + const rtl::OUString& inputFileName, + const rtl::OUString& outputFileName, + sal_Bool isBridgeInvolved) + throw (com::sun::star::uno::RuntimeException); + virtual rtl::OUString SAL_CALL export_xml( + const rtl::OUString& inputFileName, + const rtl::OUString& outputFileName, + sal_Bool isJavaBased) + throw (com::sun::star::uno::RuntimeException); + virtual rtl::OUString SAL_CALL import_xml( + const rtl::OUString& inputFileName, + const rtl::OUString& outputFileName, + sal_Bool isJavaBased) + throw (com::sun::star::uno::RuntimeException); + + virtual void SAL_CALL setCryptoDir( + const rtl::OUString & javaDirName, + const rtl::OUString & cDirName) + throw (com::sun::star::uno::RuntimeException); + + /* XDocumentHandler */ + virtual void SAL_CALL endDocument() + throw (com::sun::star::uno::RuntimeException); + virtual void SAL_CALL startDocument() + throw (com::sun::star::uno::RuntimeException); + virtual void SAL_CALL characters(const class rtl::OUString&) + throw (com::sun::star::uno::RuntimeException); + virtual void SAL_CALL processingInstruction(const rtl::OUString&, const rtl::OUString&) + throw (com::sun::star::uno::RuntimeException); + virtual void SAL_CALL ignorableWhitespace(const rtl::OUString&) + throw (com::sun::star::uno::RuntimeException); + virtual void SAL_CALL startElement( + const rtl::OUString&, + const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList >&) + throw (com::sun::star::uno::RuntimeException); + virtual void SAL_CALL endElement(const rtl::OUString&) + throw (com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setDocumentLocator( + const com::sun::star::uno::Reference< com::sun::star::xml::sax::XLocator >&) + throw (com::sun::star::uno::RuntimeException); +}; + +rtl::OUString XSecTester::parseFile( + const rtl::OUString& ouInputFileName, + const rtl::OUString& ouOutputFileName, + bool bIsExporting, + bool bIsJavaBased) +{ + rtl::OUString ouMessage; + + cssu::Reference<cssi::XInputStream> xInputStream = OpenInputStream(ouInputFileName); + + if (xInputStream != NULL ) + { + /* initialization */ + rtl::OUString SEInitializer_comp; + rtl::OUString XMLSignature_comp; + rtl::OUString tokenPath; + cssu::Reference < cssxc::XSEInitializer > xSEInitializer; + + if (bIsJavaBased) + { + SEInitializer_comp = rtl::OUString::createFromAscii( SEINITIALIZER_JAVA_COMPONENT ); + XMLSignature_comp = rtl::OUString::createFromAscii( XMLSIGNATURE_JAVA_COMPONENT); + m_ouXMLDocumentWrapperComponentName = rtl::OUString::createFromAscii( XMLDOCUMENTWRAPPER_JAVA_COMPONENT ); + tokenPath = m_ouJavaCryptokenDir; + } + else + { + SEInitializer_comp = rtl::OUString::createFromAscii( SEINITIALIZER_C_COMPONENT ); + XMLSignature_comp = rtl::OUString::createFromAscii( XMLSIGNATURE_C_COMPONENT); + m_ouXMLDocumentWrapperComponentName = rtl::OUString::createFromAscii( XMLDOCUMENT_C_COMPONENT ); + tokenPath = m_ouCCryptokenDir; + } + + xSEInitializer = cssu::Reference < cssxc::XSEInitializer > ( + mxMSF->createInstance( SEInitializer_comp ), + cssu::UNO_QUERY ); + + m_xXMLSignature = cssu::Reference<cssxc::XXMLSignature> ( + mxMSF->createInstance( XMLSignature_comp ), + cssu::UNO_QUERY ); + + if ( xSEInitializer.is() && m_xXMLSignature.is()) + { + /* create SAX Parser */ + const rtl::OUString sSaxParser ( + RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.sax.Parser") ); + m_xSaxParser = cssu::Reference < cssxs::XParser > ( mxMSF->createInstance( sSaxParser ), cssu::UNO_QUERY ); + + /* create SAX Writer */ + const rtl::OUString sSaxWriter ( + RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.sax.Writer") ); + cssu::Reference < cssi::XActiveDataSource > xSaxWriter + ( mxMSF->createInstance( sSaxWriter ), cssu::UNO_QUERY ); + + cssu::Reference< cssi::XOutputStream > xOutputStream = OpenOutputStream(ouOutputFileName); + xSaxWriter->setOutputStream( xOutputStream ); + + cssxs::InputSource aInput; + aInput.sSystemId = ouInputFileName; + aInput.aInputStream = xInputStream; + + cssu::Reference < cssxs::XDocumentHandler > xSaxWriterHandler( xSaxWriter, cssu::UNO_QUERY); + + m_xXMLSecurityContext = + xSEInitializer->createSecurityContext(tokenPath); + + m_bIsExporting = bIsExporting; + m_xExportHandler = xSaxWriterHandler; + m_xOutputHandler = xSaxWriterHandler; + + m_xXMLDocumentWrapper = NULL; + m_xSAXEventKeeper = NULL; + m_bIsSAXEventKeeperOnTheSAXChain = false; + + m_bIsBlocking = false; + m_bIsInsideCollectedElement = false; + + OSL_ASSERT(m_vSignatureList.size() == 0); + OSL_ASSERT(m_vUnsolvedReferenceURIs.size() == 0); + OSL_ASSERT(m_vUnsolvedReferenceKeeperIds.size() == 0); + OSL_ASSERT(m_vUnsolvedReferenceRefNums.size() == 0); + OSL_ASSERT(m_stCurrentPath.empty()); + OSL_ASSERT(m_stCurrentPathType.empty()); + OSL_ASSERT(m_vAncestorEvents.empty()); + + changeOutput(); + + /* foundSecurityRelated(); */ + + /* Begin to parse */ + TimeValue startTime, endTime; + osl_getSystemTime( &startTime ); + + xSaxWriterHandler->startDocument(); + + if (m_bIsExporting) + { + m_xSaxParser->setDocumentHandler(this); + m_xSaxParser->parseStream(aInput); + } + else + { + m_xSaxParser->setDocumentHandler(this); + m_xSaxParser->parseStream(aInput); + } + + endMission(); + xSaxWriterHandler->endDocument(); + + osl_getSystemTime( &endTime ); + + flushAncestorEvents( NULL ); + + // Bug in SAXWriter, done in endDocument() + // xOutputStream->closeOutput(); + xInputStream->closeInput(); + + + /* + * Free the security context + */ + xSEInitializer->freeSecurityContext(m_xXMLSecurityContext); + m_xXMLSecurityContext = NULL; + + /* Calculate the time */ + double diff = ((double)((endTime.Nanosec + endTime.Seconds*1000000000.0) + - (startTime.Nanosec + startTime.Seconds*1000000000.0))) / + ((double)1000000000.0); + + char buf[32]; + sprintf(buf, "%.2f", diff); + ouMessage += rtl::OUString(RTL_ASCII_USTRINGPARAM(buf)); + } + else + { + ouMessage += rtl::OUString::createFromAscii( "N/A" ); + } + + } + else + { + ouMessage += rtl::OUString::createFromAscii( "-" ); + } + + return ouMessage; +} + +/* XSignatureCreationResultListener */ +void SAL_CALL XSecTester::signatureCreated( + sal_Int32 securityId, + cssxc::SecurityOperationStatus creationResult ) + throw (cssu::RuntimeException) +{ + m_nTotalSignatureNumber++; + if (creationResult == cssxc::SecurityOperationStatus_OPERATION_SUCCEEDED) + { + m_nSuccessfulSignatureNumber++; + } +} + +/* XSignatureVerifyResultListener */ +void SAL_CALL XSecTester::signatureVerified( + sal_Int32 securityId, + cssxc::SecurityOperationStatus verifyResult ) + throw (cssu::RuntimeException) +{ + m_nTotalSignatureNumber++; + if (verifyResult == cssxc::SecurityOperationStatus_OPERATION_SUCCEEDED) + { + m_nSuccessfulSignatureNumber++; + } +} + +/* XSAXEventKeeperStatusChangeListener */ +void SAL_CALL XSecTester::blockingStatusChanged( sal_Bool isBlocking ) + throw (cssu::RuntimeException) +{ + this->m_bIsBlocking = isBlocking; +} + +void SAL_CALL XSecTester::collectionStatusChanged( sal_Bool isInsideCollectedElement ) + throw (cssu::RuntimeException) +{ + this->m_bIsInsideCollectedElement = isInsideCollectedElement; + + if ( !m_bIsInsideCollectedElement && !m_bIsBlocking) + { + m_bIsSAXEventKeeperOnTheSAXChain = false; + } + else + { + m_bIsSAXEventKeeperOnTheSAXChain = true; + } + changeOutput(); +} + +void SAL_CALL XSecTester::bufferStatusChanged( sal_Bool isBufferEmpty ) + throw (cssu::RuntimeException) +{ + if (isBufferEmpty) + { + m_xXMLDocumentWrapper = NULL; + + m_xSAXEventKeeper = NULL; + m_bIsSAXEventKeeperOnTheSAXChain = false; + changeOutput(); + } +} + +/* XXMLSecTester */ +rtl::OUString SAL_CALL XSecTester::export_xml( const rtl::OUString& inputFileName, const rtl::OUString& outputFileName, sal_Bool isJavaBased) + throw (cssu::RuntimeException) +{ + rtl::OUString ouMessage; + + m_nTotalSignatureNumber = 0; + m_nSuccessfulSignatureNumber = 0; + + ouMessage += parseFile(inputFileName, outputFileName, sal_True, isJavaBased); + + rtl::OUString ouRemark = rtl::OUString::valueOf(m_nSuccessfulSignatureNumber) + + rtl::OUString(RTL_ASCII_USTRINGPARAM( "/" )) + + rtl::OUString::valueOf(m_nTotalSignatureNumber); + ouMessage += rtl::OUString(RTL_ASCII_USTRINGPARAM("\t")) + ouRemark; + + return ouMessage; +} + +rtl::OUString SAL_CALL XSecTester::import_xml( const rtl::OUString& inputFileName, const rtl::OUString& outputFileName, sal_Bool isJavaBased) + throw (cssu::RuntimeException) +{ + rtl::OUString ouMessage; + + m_nTotalSignatureNumber = 0; + m_nSuccessfulSignatureNumber = 0; + + ouMessage += parseFile(inputFileName, outputFileName, sal_False, isJavaBased); + + rtl::OUString ouRemark = rtl::OUString::valueOf(m_nSuccessfulSignatureNumber) + + rtl::OUString(RTL_ASCII_USTRINGPARAM( "/" )) + + rtl::OUString::valueOf(m_nTotalSignatureNumber); + ouMessage += rtl::OUString(RTL_ASCII_USTRINGPARAM("\t")) + ouRemark; + + return ouMessage; +} + +rtl::OUString SAL_CALL XSecTester::transfer_without_sec( + const rtl::OUString& inputFileName, + const rtl::OUString& outputFileName, + sal_Bool isBridgeInvolved) + throw (cssu::RuntimeException) +{ + rtl::OUString ouMessage; + + cssu::Reference< cssi::XInputStream > xInputStream = OpenInputStream(inputFileName); + + if (xInputStream != NULL ) + { + /* create SAX Parser */ + const rtl::OUString sSaxParser ( + RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.sax.Parser") ); + m_xSaxParser = cssu::Reference < cssxs::XParser > ( mxMSF->createInstance( sSaxParser ), cssu::UNO_QUERY ); + + /* create SAX Writer */ + const rtl::OUString sSaxWriter ( + RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.sax.Writer") ); + cssu::Reference < cssi::XActiveDataSource > xSaxWriter + ( mxMSF->createInstance( sSaxWriter ), cssu::UNO_QUERY ); + cssu::Reference < cssxs::XDocumentHandler > xSaxWriterHandler( + xSaxWriter, cssu::UNO_QUERY); + + if (!isBridgeInvolved) + { + /* connect the SAX Parser and the SAX Writer */ + m_xSaxParser->setDocumentHandler ( xSaxWriterHandler ); + } + else + { + /* create Java Flat Filter */ + const rtl::OUString sJavaFlatFilter( + RTL_CONSTASCII_USTRINGPARAM( JAVAFLATFILTER_COMPONENT ) ); + cssu::Reference < cssxs::XParser > xJavaFilterParser + ( mxMSF->createInstance( sJavaFlatFilter ), cssu::UNO_QUERY ); + cssu::Reference < cssxs::XDocumentHandler > xJavaFilterHandler( + xJavaFilterParser, cssu::UNO_QUERY ); + + if ( !xJavaFilterParser.is() ) + return rtl::OUString::createFromAscii( "NO JAVA" ); + + /* connect the SAX Parser, the Java Flat Filter and the SAX Writer */ + xJavaFilterParser->setDocumentHandler( xSaxWriterHandler ); + m_xSaxParser->setDocumentHandler ( xJavaFilterHandler ); + } + + + /* set output stream */ + cssu::Reference< cssi::XOutputStream > xOutputStream = + OpenOutputStream(outputFileName); + xSaxWriter->setOutputStream( xOutputStream ); + + /* prepare input stream */ + cssxs::InputSource aInput; + aInput.sSystemId = inputFileName; + aInput.aInputStream = xInputStream; + + TimeValue startTime, endTime; + osl_getSystemTime( &startTime ); + + m_xSaxParser->parseStream ( aInput ); + + // xOutputStream->closeOutput(); + xInputStream->closeInput(); + + osl_getSystemTime( &endTime ); + + double diff = ((double)((endTime.Nanosec + endTime.Seconds*1000000000.0) + - (startTime.Nanosec + startTime.Seconds*1000000000.0)))/((double)1000000000.0); + char buf[32]; + sprintf(buf, "%.2f", diff); + ouMessage += rtl::OUString(RTL_ASCII_USTRINGPARAM(buf)); + } + + return ouMessage; +} + +void SAL_CALL XSecTester::setCryptoDir(const rtl::OUString & javaDirName, const rtl::OUString & cDirName) + throw (cssu::RuntimeException) +{ + m_ouJavaCryptokenDir = javaDirName; + m_ouCCryptokenDir = cDirName; +} + + +cssu::Reference< cssu::XInterface > SAL_CALL XSecTester_createInstance( + const cssu::Reference< cssl::XMultiServiceFactory > & rSMgr) + throw( cssu::Exception ) +{ + return (cppu::OWeakObject*) new XSecTester( rSMgr ); +} + +int SecurityEntity::m_nNextSecurityId = 1; + +SecurityEntity::SecurityEntity( + const cssu::Reference<cssxc::sax::XSecuritySAXEventKeeper>& xSAXEventKeeper, + const cssu::Reference<cssxc::XXMLSecurityContext>& xXMLSecurityContext, + const cssu::Reference<cssxc::XXMLSignature>& xXMLSignature, + const cssu::Reference< cssl::XMultiServiceFactory > &rsMSF) + :m_xSAXEventKeeper(xSAXEventKeeper), + m_xXMLSecurityContext(xXMLSecurityContext), + m_xXMLSignature(xXMLSignature), + mxMSF(rsMSF), + m_ouKeyURI(RTL_ASCII_USTRINGPARAM("")) +{ + m_nSecurityId = getNextSecurityId(); +} + +int SecurityEntity::getNextSecurityId() const +{ + int nId = m_nNextSecurityId++; + return nId; +} + +void SecurityEntity::setKeyId(int nId) +{ + cssu::Reference<cssxc::sax::XKeyCollector> keyCollector (m_xReferenceListener, cssu::UNO_QUERY); + keyCollector->setKeyId(nId); +} + + +void SecurityEntity::setKeyURI(const rtl::OUString& ouUri) +{ + m_ouKeyURI = ouUri; +} + +cssu::Reference<cssxc::sax::XReferenceResolvedListener> SecurityEntity::getReferenceListener() const +{ + return m_xReferenceListener; +} + +int SecurityEntity::getSecurityId() const +{ + return m_nSecurityId; +} + +bool SecurityEntity::setKey(const rtl::OUString& ouUri, bool bIsExporting) +{ + bool rc = false; + + if (m_ouKeyURI != rtl::OUString(RTL_ASCII_USTRINGPARAM("")) && + m_ouKeyURI == ouUri) + { + int nKeeperId = m_xSAXEventKeeper->addSecurityElementCollector( + bIsExporting ? + (cssxc::sax::ElementMarkPriority_BEFOREMODIFY): + (cssxc::sax::ElementMarkPriority_AFTERMODIFY), + true); + + setKeyId(nKeeperId); + m_xSAXEventKeeper->setSecurityId(nKeeperId, m_nSecurityId); + + cssu::Reference<cssxc::sax::XReferenceResolvedBroadcaster> xReferenceResolvedBroadcaster + (m_xSAXEventKeeper, cssu::UNO_QUERY); + xReferenceResolvedBroadcaster->addReferenceResolvedListener(nKeeperId, + m_xReferenceListener); + + rc = true; + } + + return rc; +} + +bool SecurityEntity::endMission() +{ + cssu::Reference<cssxc::sax::XMissionTaker> xMissionTaker + (m_xReferenceListener, cssu::UNO_QUERY); + + return xMissionTaker->endMission(); +} + +SignatureEntity::SignatureEntity( + const cssu::Reference<cssxc::sax::XSecuritySAXEventKeeper>& xSAXEventKeeper, + bool bIsExporting, + XSecTester* pListener, + const cssu::Reference<cssxc::XXMLSecurityContext>& xXMLSecurityContext, + const cssu::Reference<cssxc::XXMLSignature>& xXMLSignature, + const cssu::Reference< cssl::XMultiServiceFactory >& rsMSF) + :SecurityEntity(xSAXEventKeeper, + xXMLSecurityContext, + xXMLSignature, + rsMSF) +{ + if (bIsExporting) + { + m_nSignatureElementCollectorId = + m_xSAXEventKeeper->addSecurityElementCollector( + cssxc::sax::ElementMarkPriority_AFTERMODIFY, + true); + + m_xSAXEventKeeper->setSecurityId(m_nSignatureElementCollectorId, m_nSecurityId); + + m_xReferenceListener = cssu::Reference< cssxc::sax::XReferenceResolvedListener >( + mxMSF->createInstance( rtl::OUString::createFromAscii( SIGNATURECREATOR_COMPONENT )), + cssu::UNO_QUERY); + + cssu::Reference<cssl::XInitialization> xInitialization(m_xReferenceListener, cssu::UNO_QUERY); + + cssu::Sequence<cssu::Any> args(5); + char buf[16]; + + sprintf(buf, "%d", m_nSecurityId); + args[0] = cssu::makeAny(rtl::OUString(RTL_ASCII_USTRINGPARAM(buf))); + args[1] = cssu::makeAny(m_xSAXEventKeeper); + + sprintf(buf, "%d", m_nSignatureElementCollectorId); + args[2] = cssu::makeAny(rtl::OUString(RTL_ASCII_USTRINGPARAM(buf))); + args[3] = cssu::makeAny(m_xXMLSecurityContext->getSecurityEnvironment()); + args[4] = cssu::makeAny(m_xXMLSignature); + + xInitialization->initialize(args); + + int nBlockerId = m_xSAXEventKeeper->addBlocker(); + m_xSAXEventKeeper->setSecurityId(nBlockerId, m_nSecurityId); + + cssu::Reference<cssxc::sax::XBlockerMonitor> xBlockerMonitor(m_xReferenceListener, cssu::UNO_QUERY); + xBlockerMonitor->setBlockerId(nBlockerId); + + cssu::Reference< cssxc::sax::XSignatureCreationResultBroadcaster > xSignatureCreationResultBroadcaster + (m_xReferenceListener, cssu::UNO_QUERY); + xSignatureCreationResultBroadcaster->addSignatureCreationResultListener(pListener); + } + else + { + m_nSignatureElementCollectorId = + m_xSAXEventKeeper->addSecurityElementCollector( + cssxc::sax::ElementMarkPriority_BEFOREMODIFY, + false); + + m_xSAXEventKeeper->setSecurityId(m_nSignatureElementCollectorId, m_nSecurityId); + + m_xReferenceListener = cssu::Reference< cssxc::sax::XReferenceResolvedListener >( + mxMSF->createInstance( rtl::OUString::createFromAscii( SIGNATUREVERIFIER_COMPONENT )), + cssu::UNO_QUERY); + + cssu::Reference<cssl::XInitialization> xInitialization(m_xReferenceListener, cssu::UNO_QUERY); + + cssu::Sequence<cssu::Any> args(5); + char buf[16]; + + sprintf(buf, "%d", m_nSecurityId); + args[0] = cssu::makeAny(rtl::OUString(RTL_ASCII_USTRINGPARAM(buf))); + args[1] = cssu::makeAny(m_xSAXEventKeeper); + + sprintf(buf, "%d", m_nSignatureElementCollectorId); + args[2] = cssu::makeAny(rtl::OUString(RTL_ASCII_USTRINGPARAM(buf))); + args[3] = cssu::makeAny(m_xXMLSecurityContext); + args[4] = cssu::makeAny(m_xXMLSignature); + xInitialization->initialize(args); + + cssu::Reference< cssxc::sax::XSignatureVerifyResultBroadcaster > xSignatureVerifyResultBroadcaster + (m_xReferenceListener, cssu::UNO_QUERY); + xSignatureVerifyResultBroadcaster->addSignatureVerifyResultListener(pListener); + } + + cssu::Reference<cssxc::sax::XReferenceResolvedBroadcaster> xReferenceResolvedBroadcaster + (m_xSAXEventKeeper, cssu::UNO_QUERY); + xReferenceResolvedBroadcaster->addReferenceResolvedListener( + m_nSignatureElementCollectorId, m_xReferenceListener); +} + +void SignatureEntity::addReferenceURI(const rtl::OUString& ouUri) +{ + m_vReferenceIds.push_back(ouUri); +} + +void SignatureEntity::setReferenceNumber() const +{ + cssu::Reference<cssxc::sax::XReferenceCollector> xReferenceCollector + (m_xReferenceListener, cssu::UNO_QUERY); + xReferenceCollector->setReferenceCount(m_vReferenceIds.size()); +} + +bool SignatureEntity::hasReference(const rtl::OUString& ouUri) const +{ + bool rc = false; + + std::vector<const rtl::OUString>::const_iterator ii; + for (ii = m_vReferenceIds.begin(); ii != m_vReferenceIds.end(); ++ii) + { + if (ouUri == *ii) + { + rc = true; + break; + } + } + + return rc; +} + +bool SignatureEntity::setReference(const rtl::OUString& ouUri, bool bIsExporting) const +{ + bool rc = false; + + if (hasReference(ouUri)) + { + int nKeeperId = m_xSAXEventKeeper->addSecurityElementCollector( + bIsExporting ? + (cssxc::sax::ElementMarkPriority_AFTERMODIFY): + (cssxc::sax::ElementMarkPriority_BEFOREMODIFY), + false); + + m_xSAXEventKeeper->setSecurityId(nKeeperId, m_nSecurityId); + + cssu::Reference<cssxc::sax::XReferenceResolvedBroadcaster> xReferenceResolvedBroadcaster + (m_xSAXEventKeeper, cssu::UNO_QUERY); + xReferenceResolvedBroadcaster->addReferenceResolvedListener(nKeeperId, m_xReferenceListener); + + cssu::Reference<cssxc::sax::XReferenceCollector> xReferenceCollector + (m_xReferenceListener, cssu::UNO_QUERY); + xReferenceCollector->setReferenceId(nKeeperId); + + rc = true; + } + + return rc; +} + +/* XDocumentHandler */ +void SAL_CALL XSecTester::startDocument() + throw (cssu::RuntimeException) +{ +} + +void SAL_CALL XSecTester::endDocument() + throw (cssu::RuntimeException) +{ +} + +void SAL_CALL XSecTester::characters(const class rtl::OUString & chars) + throw (cssu::RuntimeException) +{ + m_xExportHandler->characters(chars); +} + +void SAL_CALL XSecTester::processingInstruction(const rtl::OUString & target, const rtl::OUString &data) + throw (cssu::RuntimeException) +{ + m_xExportHandler->processingInstruction(target, data); +} + +void SAL_CALL XSecTester::ignorableWhitespace(const rtl::OUString &) + throw (cssu::RuntimeException) +{ + +} + +void SAL_CALL XSecTester::startElement(const rtl::OUString & name, const cssu::Reference<cssxs::XAttributeList> &xAttribs) + throw (cssu::RuntimeException) +{ + rtl::OUString ouIdAttr = xAttribs->getValueByName( + rtl::OUString(RTL_ASCII_USTRINGPARAM("id"))); + + if (ouIdAttr == NULL) + { + ouIdAttr = xAttribs->getValueByName( + rtl::OUString(RTL_ASCII_USTRINGPARAM("Id"))); + } + + bool bHasIdAttr = (ouIdAttr != NULL && ouIdAttr.getLength() > 0 ); + bool needResend = false; + + if (bHasIdAttr || name.equalsAscii( SIGNATURE_STR )) + { + if (foundSecurityRelated() && ! m_bIsExporting) + { + needResend = true; + } + } + + if ( !m_bIsSAXEventKeeperOnTheSAXChain ) + { + addStartAncestorEvent(name, xAttribs); + } + + bool bSuppressingForwarding = checkSecurityElement(name, xAttribs); + + checkReference(name, xAttribs, ouIdAttr); + + if (needResend) + { + m_xSAXEventKeeper->setNextHandler(NULL); + + cssu::Reference<cssxs::XDocumentHandler> xSAXEventKeeperHandler + (m_xSAXEventKeeper, cssu::UNO_QUERY); + + xSAXEventKeeperHandler->startElement(name, xAttribs); + m_xSAXEventKeeper->setNextHandler(this); + } + + if (!bSuppressingForwarding) + { + m_xExportHandler->startElement(name, xAttribs); + } +} + +void SAL_CALL XSecTester::endElement(const rtl::OUString& name) + throw (cssu::RuntimeException) +{ + if (!m_stCurrentPath.empty()) + { + void* pSignedInfo = m_stCurrentPath.top(); + bool bIsStringType = m_stCurrentPathType.top(); + + m_stCurrentPath.pop(); + m_stCurrentPathType.pop(); + + if (bIsStringType && !strcmp((const char *)pSignedInfo, SIGNEDINFO_STR)) + { + if (!m_stCurrentPath.empty()) + { + void* pSignature = m_stCurrentPath.top(); + bIsStringType = m_stCurrentPathType.top(); + + if (!bIsStringType && pSignature != NULL) + { + ((SignatureEntity *) pSignature)->setReferenceNumber(); + } + } + } + } + + if ( !m_bIsSAXEventKeeperOnTheSAXChain ) + { + addEndAncestorEvent(name); + } + + m_xExportHandler->endElement(name); +} + +void SAL_CALL XSecTester::setDocumentLocator( const cssu::Reference<cssxs::XLocator>& ) + throw (cssu::RuntimeException) +{ +} + +void XSecTester::changeOutput() +{ + if (m_bIsExporting) + { + if (m_bIsSAXEventKeeperOnTheSAXChain) + { + m_xExportHandler = cssu::Reference<cssxs::XDocumentHandler> + (m_xSAXEventKeeper, cssu::UNO_QUERY); + + m_xSAXEventKeeper->setNextHandler(NULL); + + flushAncestorEvents(m_xExportHandler); + + m_xSAXEventKeeper->setNextHandler(m_xOutputHandler); + } + else + { + m_xExportHandler = m_xOutputHandler; + } + } + else + { + if (m_bIsSAXEventKeeperOnTheSAXChain) + { + cssu::Reference<cssxs::XDocumentHandler> xSAXEventKeeperHandler + (m_xSAXEventKeeper, cssu::UNO_QUERY); + + m_xSAXEventKeeper->setNextHandler(NULL); + + flushAncestorEvents(xSAXEventKeeperHandler); + + m_xSaxParser->setDocumentHandler(xSAXEventKeeperHandler); + m_xSAXEventKeeper->setNextHandler(this); + } + else + { + m_xSaxParser->setDocumentHandler(this); + } + + } +} + +bool XSecTester::foundSecurityRelated() +{ + if (m_xSAXEventKeeper == NULL) + { + m_bIsBlocking = false; + m_bIsInsideCollectedElement = false; + + m_xXMLDocumentWrapper = cssu::Reference<cssxw::XXMLDocumentWrapper> + (mxMSF->createInstance( m_ouXMLDocumentWrapperComponentName ), + cssu::UNO_QUERY); + + m_xSAXEventKeeper = cssu::Reference< cssxc::sax::XSecuritySAXEventKeeper > + (mxMSF->createInstance( rtl::OUString::createFromAscii( SAXEVENTKEEPER_COMPONENT )), + cssu::UNO_QUERY); + + cssu::Reference<cssl::XInitialization> xInitialization(m_xSAXEventKeeper, cssu::UNO_QUERY); + + cssu::Sequence <cssu::Any> arg(1); + arg[0] = cssu::makeAny(m_xXMLDocumentWrapper); + xInitialization->initialize(arg); + + cssu::Reference<cssxc::sax::XSAXEventKeeperStatusChangeBroadcaster> + xSAXEventKeeperStatusChangeBroadcaster(m_xSAXEventKeeper, cssu::UNO_QUERY); + xSAXEventKeeperStatusChangeBroadcaster->addSAXEventKeeperStatusChangeListener(this); + } + + bool rc = false; + + if (!m_bIsSAXEventKeeperOnTheSAXChain) + { + rc = true; + } + + m_bIsSAXEventKeeperOnTheSAXChain=true; + changeOutput(); + + return rc; +} + +void XSecTester::findKeyOrReference(SecurityEntity* pSecurityEntity, const rtl::OUString& ouUri, bool bIsFindingKey) +{ + std::vector<rtl::OUString>::iterator ii_referenceURIs; + std::vector<int>::iterator ii_referenceKeeperIds; + std::vector<int>::iterator ii_referenceRefNums; + + for (ii_referenceURIs = m_vUnsolvedReferenceURIs.begin(), + ii_referenceKeeperIds = m_vUnsolvedReferenceKeeperIds.begin(), + ii_referenceRefNums = m_vUnsolvedReferenceRefNums.begin(); + ii_referenceURIs != m_vUnsolvedReferenceURIs.end(); ) + { + rtl::OUString ouReferenceUri = *ii_referenceURIs; + + if (ouReferenceUri == ouUri) + { + int nKeeperId = *ii_referenceKeeperIds; + int nRefNum = *ii_referenceRefNums; + + if ( bIsFindingKey ) + { + int nClonedKeeperId = m_xSAXEventKeeper->cloneElementCollector( + nKeeperId, + m_bIsExporting? + (cssxc::sax::ElementMarkPriority_BEFOREMODIFY): + (cssxc::sax::ElementMarkPriority_AFTERMODIFY)); + + pSecurityEntity->setKeyId(nClonedKeeperId); + + m_xSAXEventKeeper->setSecurityId(nClonedKeeperId, pSecurityEntity->getSecurityId()); + + cssu::Reference<cssxc::sax::XReferenceResolvedBroadcaster> + xReferenceResolvedBroadcaster(m_xSAXEventKeeper, cssu::UNO_QUERY); + xReferenceResolvedBroadcaster->addReferenceResolvedListener( + nClonedKeeperId, + pSecurityEntity->getReferenceListener()); + } + else + { + int nClonedKeeperId = m_xSAXEventKeeper->cloneElementCollector( + nKeeperId, + m_bIsExporting? + (cssxc::sax::ElementMarkPriority_AFTERMODIFY): + (cssxc::sax::ElementMarkPriority_BEFOREMODIFY)); + + m_xSAXEventKeeper->setSecurityId(nClonedKeeperId, pSecurityEntity->getSecurityId()); + + cssu::Reference<cssxc::sax::XReferenceResolvedBroadcaster> + xReferenceResolvedBroadcaster + (m_xSAXEventKeeper, cssu::UNO_QUERY); + xReferenceResolvedBroadcaster->addReferenceResolvedListener( + nClonedKeeperId, + pSecurityEntity->getReferenceListener()); + + cssu::Reference<cssxc::sax::XReferenceCollector> xReferenceCollector + (pSecurityEntity->getReferenceListener(), cssu::UNO_QUERY); + xReferenceCollector->setReferenceId(nClonedKeeperId); + } + + nRefNum--; + if (nRefNum == 0) + { + m_xSAXEventKeeper->removeElementCollector(nKeeperId); + + ii_referenceURIs = m_vUnsolvedReferenceURIs.erase(ii_referenceURIs); + ii_referenceKeeperIds = m_vUnsolvedReferenceKeeperIds.erase(ii_referenceKeeperIds); + ii_referenceRefNums = m_vUnsolvedReferenceRefNums.erase(ii_referenceRefNums); + } + else + { + (*ii_referenceRefNums) = nRefNum; + + ii_referenceURIs++; + ii_referenceKeeperIds++; + ii_referenceRefNums++; + } + + if (bIsFindingKey) + { + break; + } + } + else + { + ii_referenceURIs++; + ii_referenceKeeperIds++; + ii_referenceRefNums++; + } + } +} + +bool XSecTester::checkSecurityElement( + const rtl::OUString& ouLocalName, + const cssu::Reference<cssxs::XAttributeList>& xAttribs) +{ + bool rc = false; + + if (ouLocalName.equalsAscii(SIGNATURE_STR)) + { + SignatureEntity* pSignatureEntity = new SignatureEntity( + m_xSAXEventKeeper, + m_bIsExporting, + this, + m_xXMLSecurityContext, + m_xXMLSignature, + mxMSF); + + m_vSignatureList.push_back(pSignatureEntity); + + m_stCurrentPath.push(pSignatureEntity); + m_stCurrentPathType.push(false); + } + else if (ouLocalName.equalsAscii(REFERENCE_STR)) + { + if (!m_stCurrentPath.empty()) + { + void* pSignedInfo = m_stCurrentPath.top(); + bool bIsStringType = m_stCurrentPathType.top(); + + m_stCurrentPath.pop(); + m_stCurrentPathType.pop(); + + if (bIsStringType && !m_stCurrentPath.empty()) + { + void* pSignature = m_stCurrentPath.top(); + bool bIsStringType2 = m_stCurrentPathType.top(); + + if (!strcmp((const char*)pSignedInfo, SIGNEDINFO_STR) && !bIsStringType2) + { + rtl::OUString ouUri = xAttribs->getValueByName + (rtl::OUString(RTL_ASCII_USTRINGPARAM( URI_ATTR_STR ))); + + if (ouUri.matchAsciiL("#", 1, 0)) + { + rtl::OUString uri = ouUri.copy(1); + SignatureEntity* pSignatureEntity = (SignatureEntity *)pSignature; + + if (uri != NULL && uri.getLength()>0) + { + pSignatureEntity->addReferenceURI(uri); + findKeyOrReference(pSignatureEntity, uri, true); + } + } + } + } + m_stCurrentPath.push(pSignedInfo); + m_stCurrentPathType.push(bIsStringType); + } + m_stCurrentPath.push( (void *)REFERENCE_STR); + m_stCurrentPathType.push(true); + } + else if(ouLocalName.equalsAscii(KEYVALUE_STR) || + ouLocalName.equalsAscii(KEYNAME_STR) || + ouLocalName.equalsAscii(X509DATA_STR) || + ouLocalName.equalsAscii(ENCRYPTEDKEY_STR)) + { + if (!m_stCurrentPath.empty()) + { + void* pKeyInfo = m_stCurrentPath.top(); + bool bIsStringType = m_stCurrentPathType.top(); + + m_stCurrentPath.pop(); + m_stCurrentPathType.pop(); + + if (bIsStringType && !m_stCurrentPath.empty()) + { + bool bIsStringType2 = m_stCurrentPathType.top(); + + if (!bIsStringType2) + { + SecurityEntity *pSecurityEntity = + (SecurityEntity *) (m_stCurrentPath.top()); + pSecurityEntity->setKeyId(0); + } + } + + m_stCurrentPath.push(pKeyInfo); + m_stCurrentPathType.push(bIsStringType); + } + + m_stCurrentPath.push((void *)KEYVALUE_STR); + m_stCurrentPathType.push(true); + } + else if(ouLocalName.equalsAscii(RETRIEVALMETHOD_STR)) + { + if (!m_stCurrentPath.empty()) + { + void* pKeyInfo = m_stCurrentPath.top(); + bool bIsStringType = m_stCurrentPathType.top(); + + m_stCurrentPath.pop(); + m_stCurrentPathType.pop(); + + if (bIsStringType && !m_stCurrentPath.empty()) + { + bool bIsStringType2 = m_stCurrentPathType.top(); + + if (!bIsStringType2) + { + SecurityEntity *pSecurityEntity = + (SecurityEntity *) m_stCurrentPath.top(); + rtl::OUString ouUri = xAttribs->getValueByName( + rtl::OUString(RTL_ASCII_USTRINGPARAM( URI_ATTR_STR ))); + + if (!strcmp((const char *)pKeyInfo, KEYINFO_STR) && + ouUri != NULL && ouUri.getLength()>0) + { + pSecurityEntity->setKeyURI(ouUri); + findKeyOrReference(pSecurityEntity, ouUri, true); + } + } + + } + + m_stCurrentPath.push(pKeyInfo); + m_stCurrentPathType.push(bIsStringType); + } + + m_stCurrentPath.push((void *)RETRIEVALMETHOD_STR); + m_stCurrentPathType.push(true); + } + else if(ouLocalName.equalsAscii(KEYINFO_STR)) + { + m_stCurrentPath.push((void *)KEYINFO_STR); + m_stCurrentPathType.push(true); + } + else if(ouLocalName.equalsAscii(SIGNEDINFO_STR)) + { + m_stCurrentPath.push((void *)SIGNEDINFO_STR); + m_stCurrentPathType.push(true); + } + else + { + m_stCurrentPath.push((void *)OTHER_ELEMENT_STR); + m_stCurrentPathType.push(true); + } + + return rc; +} + +void XSecTester::checkReference( + const rtl::OUString& ouLocalName, + const cssu::Reference<cssxs::XAttributeList>& xAttribs, + const rtl::OUString& ouId) +{ + rtl::OUString refNumStr = + xAttribs->getValueByName(rtl::OUString(RTL_ASCII_USTRINGPARAM(REFNUM_ATTR_STR))); + + if (ouId != NULL && ouId.getLength()>0 ) + { + int nRefNum = 999; + if (refNumStr != NULL && refNumStr.getLength()>0 ) + { + nRefNum = refNumStr.toInt32(); + } + + int nLength = m_vSignatureList.size(); + for (int i = 0; i<nLength; ++i) + { + SignatureEntity* pSignatureEntity = m_vSignatureList.at(i); + + if (pSignatureEntity->setReference(ouId, m_bIsExporting)) + { + nRefNum--; + } + + if (pSignatureEntity->setKey(ouId, m_bIsExporting)) + { + nRefNum--; + } + } + + if (nRefNum>0) + { + int nKeeperId; + + if (ouLocalName.equalsAscii(ENCRYPTEDKEY_STR)) + { + nKeeperId = m_xSAXEventKeeper->addSecurityElementCollector( + m_bIsExporting ? + (cssxc::sax::ElementMarkPriority_BEFOREMODIFY): + (cssxc::sax::ElementMarkPriority_AFTERMODIFY), + true); + } + else + { + nKeeperId = m_xSAXEventKeeper->addSecurityElementCollector( + m_bIsExporting? + (cssxc::sax::ElementMarkPriority_AFTERMODIFY): + (cssxc::sax::ElementMarkPriority_BEFOREMODIFY), + false); + } + + m_vUnsolvedReferenceURIs.push_back(ouId); + m_vUnsolvedReferenceKeeperIds.push_back(nKeeperId); + m_vUnsolvedReferenceRefNums.push_back(nRefNum); + } + } +} + +void XSecTester::endMission() +{ + while (m_vSignatureList.size() > 0) + { + if (m_vSignatureList.size()>0) + { + SignatureEntity * pSignatureEntity = m_vSignatureList.at(0); + m_vSignatureList.erase(m_vSignatureList.begin()); + pSignatureEntity->endMission(); + delete pSignatureEntity; + } + } + + while (m_vUnsolvedReferenceURIs.size()>0) + { + int nKeeperId = m_vUnsolvedReferenceKeeperIds.at(0); + m_xSAXEventKeeper->removeElementCollector(nKeeperId); + m_vUnsolvedReferenceURIs.erase(m_vUnsolvedReferenceURIs.begin()); + m_vUnsolvedReferenceKeeperIds.erase(m_vUnsolvedReferenceKeeperIds.begin()); + m_vUnsolvedReferenceRefNums.erase(m_vUnsolvedReferenceRefNums.begin()); + } +} + +void XSecTester::addStartAncestorEvent( + const rtl::OUString& ouName, + const cssu::Reference< cssxs::XAttributeList >& xAttribs) +{ + sal_Int32 nLength = xAttribs->getLength(); + AncestorEvent* ancestorEvent = new AncestorEvent( nLength ); + + ancestorEvent->bIsStartElement = true; + ancestorEvent->ouName = ouName; + + for (int i = 0; i<nLength; ++i) + { + (ancestorEvent->aAttributeList[i]).sName = xAttribs->getNameByIndex((short)i); + (ancestorEvent->aAttributeList[i]).sValue =xAttribs->getValueByIndex((short)i); + } + + m_vAncestorEvents.push_back(ancestorEvent); +} + +void XSecTester::addEndAncestorEvent(const rtl::OUString& ouName) +{ + AncestorEvent* ancestorEvent = new AncestorEvent(0); + + ancestorEvent->bIsStartElement = false; + ancestorEvent->ouName = ouName; + + m_vAncestorEvents.push_back(ancestorEvent); +} + +void XSecTester::sendAncestorStartElementEvent( + const rtl::OUString& ouName, + const cssu::Sequence< cssxcsax::XMLAttribute >& attrList, + const cssu::Reference< cssxs::XDocumentHandler >& xDocumentHandler) const +{ + SvXMLAttributeList* pAttributeList = new SvXMLAttributeList(); + cssu::Reference < cssxs::XAttributeList > xAttrList + = cssu::Reference< cssxs::XAttributeList > (pAttributeList); + + sal_Int32 nLength = attrList.getLength(); + + for (int i = 0; i<nLength; ++i) + { + pAttributeList->AddAttribute( attrList[i].sName, attrList[i].sValue); + } + + xDocumentHandler->startElement(ouName, xAttrList); +} + +void XSecTester::sendAncestorEndElementEvent( + const rtl::OUString& ouName, + const cssu::Reference< cssxs::XDocumentHandler >& xDocumentHandler) const +{ + xDocumentHandler->endElement(ouName); +} + +std::vector< AncestorEvent* >::const_iterator XSecTester::checkAncestorStartElementEvent( + const std::vector< AncestorEvent* >::const_iterator& ii, + const cssu::Reference< cssxs::XDocumentHandler >& xDocumentHandler) const +{ + std::vector< AncestorEvent* >::const_iterator next = ii+1; + + if (next == m_vAncestorEvents.end()) + { + sendAncestorStartElementEvent( + (*ii)->ouName, (*ii)->aAttributeList, xDocumentHandler); + } + else + { + while ((next != m_vAncestorEvents.end()) && ((*next)->bIsStartElement)) + { + next = checkAncestorStartElementEvent(next, xDocumentHandler); + } + + if (next != m_vAncestorEvents.end()) + { + next++; + } + } + + return next; +} + +void XSecTester::flushAncestorEvents( + const cssu::Reference< cssxs::XDocumentHandler >& xDocumentHandler) +{ + std::vector< AncestorEvent* >::const_iterator ii; + + if (xDocumentHandler != NULL) + { + ii = m_vAncestorEvents.begin(); + + while (ii != m_vAncestorEvents.end()) + { + AncestorEvent* ancestorEvent = *ii; + + if (ancestorEvent->bIsStartElement) + { + ii = checkAncestorStartElementEvent(ii, xDocumentHandler); + } + else + { + sendAncestorEndElementEvent((*ii)->ouName, xDocumentHandler); + ii++; + } + } + } + + /* free the ancestor events list */ + std::vector< AncestorEvent* >::iterator jj; + + while (m_vAncestorEvents.size()>0) + { + jj = m_vAncestorEvents.begin(); + delete *jj; + m_vAncestorEvents.erase(jj); + } +} + +/* + * Get the length of a file in a platform independant fashion + */ +int getLength(const char *pInputFileName) +{ + int nSize = 0; + std::ifstream data(pInputFileName); + + data.seekg(0, std::ios_base::end); + nSize = data.tellg(); + + return nSize; +} + +void outputHeader() +{ + fprintf(stderr, "%16s%4s%8s%12s%12s%12s%12s\n", "File Name", "E/I", "Size", "-C++", "-Java", "Forw-O", "No S/E"); + fprintf(stderr, "===============================================================================\n"); +} + +/* + * print the output on the screen as well as in the GNUPlot data file + */ +void output(const rtl::OUString& ouInputFileName, + const rtl::OUString& ouTime_C, + const rtl::OUString& ouTime_Java, + const rtl::OUString& ouTime_NoSecurity, + const rtl::OUString& ouTime_JavaForwardOnly, + const rtl::OUString& ouRemark_C, + const rtl::OUString& ouRemark_Java, + bool bIsExporting) +{ + int nSize = getLength(rtl::OString(ouInputFileName, ouInputFileName.getLength(), RTL_TEXTENCODING_ASCII_US).getStr()); + std::ofstream data; + + /* print screen */ + int nPosition = ouInputFileName.lastIndexOf('\\'); + rtl::OUString fileName = ouInputFileName.copy(nPosition + 1); + + fprintf(stderr, "%16s", rtl::OString(fileName, fileName.getLength(), RTL_TEXTENCODING_ASCII_US).getStr()); + + fprintf(stderr, "%4s", bIsExporting?"E":"I"); + fprintf(stderr, "%7dK", nSize/1024); + fprintf(stderr, "%8s %3s", + rtl::OString(ouTime_C, ouTime_C.getLength(), RTL_TEXTENCODING_ASCII_US).getStr(), + rtl::OString(ouRemark_C, ouRemark_C.getLength(), RTL_TEXTENCODING_ASCII_US).getStr()); + fprintf(stderr, "%8s %3s", + rtl::OString(ouTime_Java, ouTime_Java.getLength(), RTL_TEXTENCODING_ASCII_US).getStr(), + rtl::OString(ouRemark_Java, ouRemark_Java.getLength(), RTL_TEXTENCODING_ASCII_US).getStr()); + fprintf(stderr, "%12s", rtl::OString(ouTime_JavaForwardOnly, ouTime_JavaForwardOnly.getLength(), RTL_TEXTENCODING_ASCII_US).getStr()); + fprintf(stderr, "%12s", rtl::OString(ouTime_NoSecurity, ouTime_NoSecurity.getLength(), RTL_TEXTENCODING_ASCII_US).getStr()); + fprintf(stderr, "\n"); + + /* output the data as GNUPlot data file */ + /* + char str[32]; + sprintf(str, "%d %s", nSize, rtl::OString(ouTime_C, ouTime_C.getLength(), RTL_TEXTENCODING_ASCII_US).getStr()); + data.open("d:\\time_vs_size.txt", std::ios::app); + data << str << std::endl; + data.close(); + + sprintf(str, "%d %s", nSize, rtl::OString(ouTime_Java, ouTime_Java.getLength(), RTL_TEXTENCODING_ASCII_US).getStr()); + data.open("d:\\time_vs_size_without_sec.txt", std::ios::app); + data << str << std::endl; + data.close(); + */ +} + +int main( int argc, char **argv ) +{ + if (argc < 3) + { + fprintf(stderr, "Usage: testtool <exportbatchfile> <importbatchfile> [<cppcryptotoken>] [<javacryptotoken>]\n"); + exit (-1); + } + + rtl::OUString aExportBatchFile = rtl::OUString::createFromAscii(argv[1]); + rtl::OUString aImportBatchFile = rtl::OUString::createFromAscii(argv[2]); + rtl::OUString aCPPCryptoToken; + if ( argc > 3 ) + aCPPCryptoToken = rtl::OUString::createFromAscii(argv[3]); + rtl::OUString aJavaCryptoToken; + if ( argc > 4 ) + aJavaCryptoToken = rtl::OUString::createFromAscii(argv[4]); + + try + { + uno::Reference< lang::XMultiServiceFactory > xMSF = CreateDemoServiceFactory(); + + XSecTester* pTester = new XSecTester( xMSF ); + uno::Reference< xml::sax::XDocumentHandler > xKeepARef = pTester; + + pTester->setCryptoDir( aJavaCryptoToken, aCPPCryptoToken ); + + rtl::OUString ouTime_C, ouTime_Java, ouTime_NoSecurity, ouTime_JavaForwardOnly; + rtl::OUString ouInputFileName; + rtl::OUString outputFileName1; + rtl::OUString outputFileName2; + rtl::OUString ouRemark_C, ouRemark_Java; + + outputHeader(); + + std::ifstream batch_export, batch_import; + + batch_export.open(OUStringToOString( aExportBatchFile, RTL_TEXTENCODING_ASCII_US ).getStr()); + + const int MAX_LINE = 80; + char line[MAX_LINE + 1]; + + while (batch_export.getline(line, MAX_LINE)) + { + ouInputFileName = rtl::OUString::createFromAscii(line); + int nPosition = ouInputFileName.lastIndexOf('.'); + int nPosition1; + + /* + * export the file with signautre/encryption (C++) + */ + outputFileName1 = ouInputFileName.copy(0, nPosition) + + rtl::OUString::createFromAscii("-ex.xml"); + ouTime_C = pTester->export_xml(ouInputFileName, outputFileName1, sal_False); + nPosition1 = ouTime_C.lastIndexOf('\t'); + ouRemark_C = ouTime_C.copy(nPosition1 + 1); + ouTime_C = ouTime_C.copy(0, nPosition1); + + /* + * export the file with signautre/encryption (Java) + */ + outputFileName1 = ouInputFileName.copy(0, nPosition) + + rtl::OUString::createFromAscii("-ex2.xml"); + ouTime_Java = pTester->export_xml(ouInputFileName, outputFileName1, sal_True); + nPosition1 = ouTime_Java.lastIndexOf('\t'); + ouRemark_Java = ouTime_Java.copy(nPosition1 + 1); + ouTime_Java = ouTime_Java.copy(0, nPosition1); + + /* + * export the file without signautre/encryption + */ + outputFileName2 = ouInputFileName.copy(0, nPosition) + + rtl::OUString::createFromAscii("-ex-no.xml"); + ouTime_NoSecurity = pTester->transfer_without_sec(ouInputFileName, outputFileName2, sal_False); + + /* + * export the file with Java Flat Filter + */ + outputFileName2 = ouInputFileName.copy(0, nPosition) + + rtl::OUString::createFromAscii("-ex-jf.xml"); + ouTime_JavaForwardOnly = pTester->transfer_without_sec(ouInputFileName, outputFileName2, sal_True); + + /* + * print output + */ + output(ouInputFileName, ouTime_C, ouTime_Java, ouTime_NoSecurity, ouTime_JavaForwardOnly, ouRemark_C, ouRemark_Java, true); + } + + batch_export.close(); + + batch_import.open(OUStringToOString( aImportBatchFile, RTL_TEXTENCODING_ASCII_US ).getStr()); + + while (batch_import.getline(line, MAX_LINE)) + { + ouInputFileName = rtl::OUString::createFromAscii(line); + int nPosition = ouInputFileName.lastIndexOf('.'); + int nPosition1; + + /* + * import the file with signautre/encryption (C++) + */ + outputFileName1 = ouInputFileName.copy(0, nPosition) + + rtl::OUString::createFromAscii("-im.xml"); + ouTime_C = pTester->import_xml(ouInputFileName, outputFileName1, sal_False); + nPosition1 = ouTime_C.lastIndexOf('\t'); + ouRemark_C = ouTime_C.copy(nPosition1 + 1); + ouTime_C = ouTime_C.copy(0, nPosition1); + + /* + * import the file with signautre/encryption (Java) + */ + outputFileName1 = ouInputFileName.copy(0, nPosition) + + rtl::OUString::createFromAscii("-im2.xml"); + ouTime_Java = pTester->import_xml(ouInputFileName, outputFileName1, sal_True); + nPosition1 = ouTime_Java.lastIndexOf('\t'); + ouRemark_Java = ouTime_Java.copy(nPosition1 + 1); + ouTime_Java = ouTime_Java.copy(0, nPosition1); + + /* + * import the file without signautre/encryption + */ + outputFileName2 = ouInputFileName.copy(0, nPosition) + + rtl::OUString::createFromAscii("-im-no.xml"); + ouTime_NoSecurity = pTester->transfer_without_sec(ouInputFileName, outputFileName2, sal_False); + + /* + * import the file without signautre/encryption + */ + + outputFileName2 = ouInputFileName.copy(0, nPosition) + + rtl::OUString::createFromAscii("-im-jf.xml"); + ouTime_JavaForwardOnly = pTester->transfer_without_sec(ouInputFileName, outputFileName2, sal_True); + + /* + * print output + */ + output(ouInputFileName, ouTime_C, ouTime_Java, ouTime_NoSecurity, ouTime_JavaForwardOnly, ouRemark_C, ouRemark_Java, false); + } + + batch_import.close(); + + fprintf(stderr, "\n"); + } + catch( cssu::Exception& e ) + { + fprintf( stderr , "\nEXCEPTION! Error Message: %s\n" , + rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ).getStr() ) ; + } + + return 0; +} diff --git a/xmlsecurity/tools/demo/readme.txt b/xmlsecurity/tools/demo/readme.txt new file mode 100644 index 000000000000..33b5e56ccecb --- /dev/null +++ b/xmlsecurity/tools/demo/readme.txt @@ -0,0 +1,22 @@ +How to use the demo programs +================================= + + +PERFORMANCE +------------------------------- + +This program is for evaluating the performance of the XML Security framework. + +You can use the sample files from tools/examples: + +run "performance eval_export.txt eval_import.txt" + +The export file list includes all files need to be signed, and the import file list include all files need to be verified. + +JavaFlatFilter: +Used to test performance with Java. +Currently it doesn't work, seems to be because of JavaFramework doesn't work in stand alone program. + +In case you want to try it: +- set CLASSPATH=e:\Solar\r\j2sdk1.4.1_03\jre\lib;d:\x\juh.jar;d:\x\jurt.jar;d:\x\ridl.jar;d:\x\unoil.jar;d:\x\java_uno.jar +- regcomp -register -r demo.rdb -c file://d/x/jflatfilter.jar -br demo.rdb
\ No newline at end of file diff --git a/xmlsecurity/tools/demo/signdemo.cxx b/xmlsecurity/tools/demo/signdemo.cxx new file mode 100644 index 000000000000..8cdd50eb551a --- /dev/null +++ b/xmlsecurity/tools/demo/signdemo.cxx @@ -0,0 +1,160 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: signdemo.cxx,v $ + * $Revision: 1.13 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_xmlsecurity.hxx" + +#include "util.hxx" + +#include <stdio.h> +#include <tools/date.hxx> +#include <tools/time.hxx> +#include <cppuhelper/servicefactory.hxx> + +#include <xmlsecurity/biginteger.hxx> +#include <xmlsecurity/xmlsignaturehelper.hxx> +#include "xmlsecurity/baseencoding.hxx" + +using namespace ::com::sun::star; + +int SAL_CALL main( int argc, char **argv ) +{ + if( argc < 4 ) + { + fprintf( stderr, "Usage: %s <signature file> <xml stream file> <binary stream file> [<cryptoken>]\n" , argv[0] ) ; + return -1 ; + } + + rtl::OUString aSIGFileName = rtl::OUString::createFromAscii(argv[1]); + rtl::OUString aXMLFileName = rtl::OUString::createFromAscii(argv[2]); + rtl::OUString aBINFileName = rtl::OUString::createFromAscii(argv[3]); + rtl::OUString aCryptoToken; + if ( argc >= 5 ) + aCryptoToken = rtl::OUString::createFromAscii(argv[4]); + + uno::Reference< lang::XMultiServiceFactory > xMSF = CreateDemoServiceFactory(); + + /* + * creates a signature helper + */ + XMLSignatureHelper aSignatureHelper( xMSF ); + + /* + * creates a security context. + */ + bool bInit = aSignatureHelper.Init( aCryptoToken ); + if ( !bInit ) + { + fprintf( stderr, "Error initializing security context!\n" ); + return -1; + } + + aSignatureHelper.StartMission(); + + /* + * select a private key certificate + */ + sal_Int32 i; + sal_Int32 nEnvCount = aSignatureHelper.GetSecurityEnvironmentNumber(); + if( nEnvCount == 0 ) + { + fprintf( stdout, "\nNo SecurityEnvironment found!\n" ) ; + return -1; + } + + uno::Sequence< uno::Reference< xml::crypto::XSecurityEnvironment > > xSecurityEnvironments(nEnvCount) ; + for( i=0; i < nEnvCount; i++ ) + xSecurityEnvironments[i] = aSignatureHelper.GetSecurityEnvironmentByIndex(i); + + fprintf( stdout, "\nSelect a SecurityEnvironment:\n" ) ; + for( i = 0; i < nEnvCount; i ++ ) + fprintf( stdout, "\n[%d] %s", i+1, rtl::OUStringToOString( xSecurityEnvironments[i]->getSecurityEnvironmentInformation() ,RTL_TEXTENCODING_ASCII_US ).getStr()); + + sal_Int32 nEnvIndex = QuerySelectNumber( 1, nEnvCount ) -1; + + uno::Reference< ::com::sun::star::security::XCertificate > xPersonalCert = getCertificateFromEnvironment(xSecurityEnvironments[nEnvIndex], true); + + if ( !xPersonalCert.is() ) + { + fprintf( stdout, "No certificate choosen - exit.\n" ); + return (-2); + } + + /* + * creates a new signature id + */ + sal_Int32 nSecurityId = aSignatureHelper.GetNewSecurityId(); + + /* + * configures the X509 certificate + */ + aSignatureHelper.SetX509Certificate( + nSecurityId, nEnvIndex, + xPersonalCert->getIssuerName(), + bigIntegerToNumericString( xPersonalCert->getSerialNumber()), + baseEncode(xPersonalCert->getEncoded(), BASE64)); + + /* + * configures date/time + */ + aSignatureHelper.SetDateTime( nSecurityId, Date(), Time()); + + /* + * signs the xml stream + */ + aSignatureHelper.AddForSigning( nSecurityId, aXMLFileName, aXMLFileName, sal_False ); + + /* + * signs the binary stream + */ + aSignatureHelper.AddForSigning( nSecurityId, aBINFileName, aBINFileName, sal_True ); + + /* + * creates signature + */ + uno::Reference< io::XOutputStream > xOutputStream = OpenOutputStream( aSIGFileName ); + bool bDone = aSignatureHelper.CreateAndWriteSignature( xOutputStream ); + + if ( !bDone ) + { + fprintf( stderr, "\nSTATUS: Error creating Signature!\n" ); + } + else + { + fprintf( stdout, "\nSTATUS: Signature successfully created!\n" ); + } + + aSignatureHelper.EndMission(); + + QueryPrintSignatureDetails( aSignatureHelper.GetSignatureInformations(), aSignatureHelper.GetSecurityEnvironment() ); + + return 0; +} + diff --git a/xmlsecurity/tools/demo/util.cxx b/xmlsecurity/tools/demo/util.cxx new file mode 100644 index 000000000000..dec0241b3db5 --- /dev/null +++ b/xmlsecurity/tools/demo/util.cxx @@ -0,0 +1,114 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: util.cxx,v $ + * $Revision: 1.13 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_xmlsecurity.hxx" + +#include "util.hxx" + +#include <stdio.h> + +#include <com/sun/star/registry/XImplementationRegistration.hpp> +#include <cppuhelper/bootstrap.hxx> +#include <comphelper/processfactory.hxx> +#include <unotools/streamhelper.hxx> +#include <tools/string.hxx> + +namespace cssu = com::sun::star::uno; +namespace cssl = com::sun::star::lang; +namespace cssxc = com::sun::star::xml::crypto; +namespace cssi = com::sun::star::io; + +using namespace ::com::sun::star; + +cssu::Reference< cssl::XMultiServiceFactory > CreateDemoServiceFactory() +{ + cssu::Reference< cssl::XMultiServiceFactory > xMSF; + + try + { + cssu::Reference< cssl::XMultiComponentFactory > xLocalServiceManager = NULL ; + cssu::Reference< cssu::XComponentContext > xLocalComponentContext = NULL ; + + cssu::Reference< ::com::sun::star::registry::XSimpleRegistry > xSimpleRegistry + = ::cppu::createSimpleRegistry(); + OSL_ENSURE( xSimpleRegistry.is(), + "serviceManager - " + "Cannot create simple registry" ) ; + + xSimpleRegistry->open(rtl::OUString::createFromAscii( "demo.rdb" ), sal_True, sal_False); + OSL_ENSURE( xSimpleRegistry->isValid() , + "serviceManager - " + "Cannot open xml security registry rdb" ) ; + + xLocalComponentContext = ::cppu::bootstrap_InitialComponentContext( xSimpleRegistry ) ; + OSL_ENSURE( xLocalComponentContext.is() , + "serviceManager - " + "Cannot create intial component context" ) ; + + xLocalServiceManager = xLocalComponentContext->getServiceManager() ; + OSL_ENSURE( xLocalServiceManager.is() , + "serviceManager - " + "Cannot create intial service manager" ) ; + + xMSF = cssu::Reference< cssl::XMultiServiceFactory >(xLocalServiceManager, cssu::UNO_QUERY) ; + + ::comphelper::setProcessServiceFactory( xMSF ); + } + catch( cssu::Exception& e ) + { + fprintf( stderr , "Error creating ServiceManager, Exception is %s\n" , rtl::OUStringToOString( e.Message , RTL_TEXTENCODING_ASCII_US ).getStr() ) ; + exit (-1); + } + + return xMSF; +} + +::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > OpenInputStream( const ::rtl::OUString& rStreamName ) +{ + SvFileStream* pStream = new SvFileStream( rStreamName, STREAM_READ ); + pStream->Seek( STREAM_SEEK_TO_END ); + ULONG nBytes = pStream->Tell(); + pStream->Seek( STREAM_SEEK_TO_BEGIN ); + SvLockBytesRef xLockBytes = new SvLockBytes( pStream, TRUE ); + uno::Reference< io::XInputStream > xInputStream = new utl::OInputStreamHelper( xLockBytes, nBytes ); + + return xInputStream; + +} + +::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > OpenOutputStream( const ::rtl::OUString& rStreamName ) +{ + SvFileStream* pStream = new SvFileStream( rStreamName, STREAM_WRITE ); + SvLockBytesRef xLockBytes = new SvLockBytes( pStream, TRUE ); + uno::Reference< io::XOutputStream > xOutputStream = new utl::OOutputStreamHelper( xLockBytes ); + + return xOutputStream; +} diff --git a/xmlsecurity/tools/demo/util.hxx b/xmlsecurity/tools/demo/util.hxx new file mode 100644 index 000000000000..818b4fb9eaa6 --- /dev/null +++ b/xmlsecurity/tools/demo/util.hxx @@ -0,0 +1,53 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: util.hxx,v $ + * $Revision: 1.7 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include <rtl/ustring.hxx> + +#include <cppuhelper/servicefactory.hxx> +#include <xmlsecurity/xmlsignaturehelper.hxx> + +// Get the demo.rdb servcie manager... +::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > CreateDemoServiceFactory(); + +// Ask user to show more signature details... +void QueryPrintSignatureDetails( const SignatureInformations& SignatureInformations, ::com::sun::star::uno::Reference< ::com::sun::star::xml::crypto::XSecurityEnvironment > ); + +// Query value from user. +int QuerySelectNumber( int nMin, int nMax ); + +// Ask to verify the signature +long QueryVerifySignature(); + +// Open In/Output Stream +::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > OpenInputStream( const ::rtl::OUString& rStreamName ); +::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > OpenOutputStream( const ::rtl::OUString& rStreamName ); + +::rtl::OUString getSignatureInformations( const SignatureInformations& SignatureInformations, ::com::sun::star::uno::Reference< ::com::sun::star::xml::crypto::XSecurityEnvironment > xSecurityEnvironment ); +::com::sun::star::uno::Reference< ::com::sun::star::security::XCertificate > getCertificateFromEnvironment( ::com::sun::star::uno::Reference< ::com::sun::star::xml::crypto::XSecurityEnvironment > xSecurityEnvironment, BOOL nType); diff --git a/xmlsecurity/tools/demo/util2.cxx b/xmlsecurity/tools/demo/util2.cxx new file mode 100644 index 000000000000..eeb5e0f32c62 --- /dev/null +++ b/xmlsecurity/tools/demo/util2.cxx @@ -0,0 +1,429 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: util2.cxx,v $ + * $Revision: 1.6 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_xmlsecurity.hxx" + +#include <rtl/locale.h> +#include <osl/nlsupport.h> +#include <osl/process.h> + +#include <util.hxx> + +#include <stdio.h> + +#include <com/sun/star/registry/XImplementationRegistration.hpp> +#include <com/sun/star/security/KeyUsage.hpp> +#include <cppuhelper/bootstrap.hxx> +#include <xmlsecurity/biginteger.hxx> +#include <comphelper/processfactory.hxx> +#include <unotools/streamhelper.hxx> + +#include <rtl/ustrbuf.hxx> +#include <tools/string.hxx> + +namespace cssu = com::sun::star::uno; +namespace cssl = com::sun::star::lang; +namespace cssxc = com::sun::star::xml::crypto; +namespace cssi = com::sun::star::io; + +using namespace ::com::sun::star; + +/** convert util::DateTime to ISO Date String */ +void convertDateTime( ::rtl::OUStringBuffer& rBuffer, + const com::sun::star::util::DateTime& rDateTime ) +{ + String aString( String::CreateFromInt32( rDateTime.Year ) ); + aString += '-'; + if( rDateTime.Month < 10 ) + aString += '0'; + aString += String::CreateFromInt32( rDateTime.Month ); + aString += '-'; + if( rDateTime.Day < 10 ) + aString += '0'; + aString += String::CreateFromInt32( rDateTime.Day ); + + if( rDateTime.Seconds != 0 || + rDateTime.Minutes != 0 || + rDateTime.Hours != 0 ) + { + aString += 'T'; + if( rDateTime.Hours < 10 ) + aString += '0'; + aString += String::CreateFromInt32( rDateTime.Hours ); + aString += ':'; + if( rDateTime.Minutes < 10 ) + aString += '0'; + aString += String::CreateFromInt32( rDateTime.Minutes ); + aString += ':'; + if( rDateTime.Seconds < 10 ) + aString += '0'; + aString += String::CreateFromInt32( rDateTime.Seconds ); + if ( rDateTime.HundredthSeconds > 0) + { + aString += ','; + if (rDateTime.HundredthSeconds < 10) + aString += '0'; + aString += String::CreateFromInt32( rDateTime.HundredthSeconds ); + } + } + + rBuffer.append( aString ); +} + +::rtl::OUString printHexString(cssu::Sequence< sal_Int8 > data) +{ + int length = data.getLength(); + ::rtl::OUString result; + + char number[4]; + for (int j=0; j<length; j++) + { + sprintf(number, "%02X ", (unsigned char)data[j]); + result += rtl::OUString::createFromAscii( number ); + } + + return result; +} + + +::rtl::OUString getSignatureInformation( + const SignatureInformation& infor, + cssu::Reference< ::com::sun::star::xml::crypto::XSecurityEnvironment >& xSecurityEnvironment ) +{ + char* status[50] = { + "STATUS_UNKNOWN", + "OPERATION_SUCCEEDED", + "RUNTIMEERROR_FAILED", + "ENGINE_FAILED", + "MALLOC_FAILED", + "STRDUP_FAILED", + "CRYPTO_FAILED", + "XML_FAILED", + "XSLT_FAILED", + "IO_FAILED", + "DISABLED", + "NOT_IMPLEMENTED", + "INVALID_SIZE", + "INVALID_DATA", + "INVALID_RESULT", + "INVALID_TYPE", + "INVALID_OPERATION", + "INVALID_STATUS", + "INVALID_FORMAT", + "DATA_NOT_MATCH", + "INVALID_NODE", + "INVALID_NODE_CONTENT", + "INVALID_NODE_ATTRIBUTE", + "MISSING_NODE_ATTRIBUTE", + "NODE_ALREADY_PRESENT", + "UNEXPECTED_NODE", + "NODE_NOT_FOUND", + "INVALID_TRANSFORM", + "INVALID_TRANSFORM_KEY", + "INVALID_URI_TYPE", + "TRANSFORM_SAME_DOCUMENT_REQUIRED", + "TRANSFORM_DISABLED", + "INVALID_KEY_DATA", + "KEY_DATA_NOT_FOUND", + "KEY_DATA_ALREADY_EXIST", + "INVALID_KEY_DATA_SIZE", + "KEY_NOT_FOUND", + "KEYDATA_DISABLED", + "MAX_RETRIEVALS_LEVEL", + "MAX_RETRIEVAL_TYPE_MISMATCH", + "MAX_ENCKEY_LEVEL", + "CERT_VERIFY_FAILED", + "CERT_NOT_FOUND", + "CERT_REVOKED", + "CERT_ISSUER_FAILED", + "CERT_NOT_YET_VALID", + "CERT_HAS_EXPIRED", + "DSIG_NO_REFERENCES", + "DSIG_INVALID_REFERENCE", + "ASSERTION"}; + + rtl::OUString result; + + result += rtl::OUString::createFromAscii( "Security Id : " ) + +rtl::OUString::valueOf(infor.nSecurityId) + +rtl::OUString::createFromAscii( "\n" ); + result += rtl::OUString::createFromAscii( "Status : [" ) + +rtl::OUString::valueOf((sal_Int32)(infor.nStatus)) + +rtl::OUString::createFromAscii( "] " ) + +rtl::OUString::createFromAscii(status[infor.nStatus]) + +rtl::OUString::createFromAscii( "\n" ); + + const SignatureReferenceInformations& rInfors = infor.vSignatureReferenceInfors; + int i; + int size = rInfors.size(); + + result += rtl::OUString::createFromAscii( "--References :\n" ); + for (i=0; i<size; i++) + { + result += rtl::OUString::createFromAscii( "---URI : " ); + result += rInfors[i].ouURI; + result += rtl::OUString::createFromAscii( "\n" ); + result += rtl::OUString::createFromAscii( "---DigestValue : " ); + result += rInfors[i].ouDigestValue; + result += rtl::OUString::createFromAscii( "\n" ); + } + + if (infor.ouX509IssuerName.getLength()>0) + { + result += rtl::OUString::createFromAscii( "--X509IssuerName :\n" ); + result += infor.ouX509IssuerName; + result += rtl::OUString::createFromAscii( "\n" ); + } + + if (infor.ouX509SerialNumber.getLength()>0) + { + result += rtl::OUString::createFromAscii( "--X509SerialNumber :\n" ); + result += infor.ouX509SerialNumber; + result += rtl::OUString::createFromAscii( "\n" ); + } + + if (infor.ouX509Certificate.getLength()>0) + { + result += rtl::OUString::createFromAscii( "--X509Certificate :\n" ); + result += infor.ouX509Certificate; + result += rtl::OUString::createFromAscii( "\n" ); + } + + if (infor.ouSignatureValue.getLength()>0) + { + result += rtl::OUString::createFromAscii( "--SignatureValue :\n" ); + result += infor.ouSignatureValue; + result += rtl::OUString::createFromAscii( "\n" ); + } + + result += rtl::OUString::createFromAscii( "--Date :\n" ); + + ::rtl::OUStringBuffer buffer; + convertDateTime( buffer, infor.stDateTime ); + result += buffer.makeStringAndClear(); + result += rtl::OUString::createFromAscii( "\n" ); + + if (infor.ouX509IssuerName.getLength()>0 && infor.ouX509SerialNumber.getLength()>0 && xSecurityEnvironment.is()) + { + result += rtl::OUString::createFromAscii( "--Certificate Path :\n" ); + cssu::Reference< ::com::sun::star::security::XCertificate > xCert = xSecurityEnvironment->getCertificate( infor.ouX509IssuerName, numericStringToBigInteger(infor.ouX509SerialNumber) ); + cssu::Sequence < cssu::Reference< ::com::sun::star::security::XCertificate > > xCertPath; + if(! xCert.is() ) + { + fprintf(stdout , " xCert is NULL , so can not buildCertificatePath\n"); + return result ; + } + else + { + xCertPath = xSecurityEnvironment->buildCertificatePath( xCert ) ; + } + + for( int i = 0; i < xCertPath.getLength(); i++ ) + { + result += xCertPath[i]->getSubjectName(); + result += rtl::OUString::createFromAscii( "\n Subject public key algorithm : " ); + result += xCertPath[i]->getSubjectPublicKeyAlgorithm(); + result += rtl::OUString::createFromAscii( "\n Signature algorithm : " ); + result += xCertPath[i]->getSignatureAlgorithm(); + + result += rtl::OUString::createFromAscii( "\n Subject public key value : " ); + cssu::Sequence< sal_Int8 > keyValue = xCertPath[i]->getSubjectPublicKeyValue(); + result += printHexString(keyValue); + + result += rtl::OUString::createFromAscii( "\n Thumbprint (SHA1) : " ); + cssu::Sequence< sal_Int8 > SHA1Thumbprint = xCertPath[i]->getSHA1Thumbprint(); + result += printHexString(SHA1Thumbprint); + + result += rtl::OUString::createFromAscii( "\n Thumbprint (MD5) : " ); + cssu::Sequence< sal_Int8 > MD5Thumbprint = xCertPath[i]->getMD5Thumbprint(); + result += printHexString(MD5Thumbprint); + + result += rtl::OUString::createFromAscii( "\n <<\n" ); + } + + result += rtl::OUString::createFromAscii( "\n Key Usage : " ); + sal_Int32 usage = xCert->getCertificateUsage(); + + if (usage & ::com::sun::star::security::KeyUsage::DIGITAL_SIGNATURE) + { + result += rtl::OUString::createFromAscii( "DIGITAL_SIGNATURE " ); + } + + if (usage & ::com::sun::star::security::KeyUsage::NON_REPUDIATION) + { + result += rtl::OUString::createFromAscii( "NON_REPUDIATION " ); + } + + if (usage & ::com::sun::star::security::KeyUsage::KEY_ENCIPHERMENT) + { + result += rtl::OUString::createFromAscii( "KEY_ENCIPHERMENT " ); + } + + if (usage & ::com::sun::star::security::KeyUsage::DATA_ENCIPHERMENT) + { + result += rtl::OUString::createFromAscii( "DATA_ENCIPHERMENT " ); + } + + if (usage & ::com::sun::star::security::KeyUsage::KEY_AGREEMENT) + { + result += rtl::OUString::createFromAscii( "KEY_AGREEMENT " ); + } + + if (usage & ::com::sun::star::security::KeyUsage::KEY_CERT_SIGN) + { + result += rtl::OUString::createFromAscii( "KEY_CERT_SIGN " ); + } + + if (usage & ::com::sun::star::security::KeyUsage::CRL_SIGN) + { + result += rtl::OUString::createFromAscii( "CRL_SIGN " ); + } + + result += rtl::OUString::createFromAscii( "\n" ); + } + + result += rtl::OUString::createFromAscii( "\n" ); + return result; +} + +::rtl::OUString getSignatureInformations( + const SignatureInformations& SignatureInformations, + cssu::Reference< ::com::sun::star::xml::crypto::XSecurityEnvironment > xSecurityEnvironment ) +{ + rtl::OUString result; + int i; + int size = SignatureInformations.size(); + + for (i=0; i<size; i++) + { + const SignatureInformation& infor = SignatureInformations[i]; + result += getSignatureInformation( infor, xSecurityEnvironment ); + } + + result += rtl::OUString::createFromAscii( "\n" ); + + return result; +} + +::com::sun::star::uno::Reference< ::com::sun::star::security::XCertificate > + getCertificateFromEnvironment( ::com::sun::star::uno::Reference< ::com::sun::star::xml::crypto::XSecurityEnvironment > xSecurityEnvironment , BOOL nType) +{ + cssu::Sequence< cssu::Reference< ::com::sun::star::security::XCertificate > > xPersonalCerts ; + int length = 0; + int i; + + // add By CP + sal_uInt16 encoding ; + rtl_Locale *pLocale = NULL ; + osl_getProcessLocale( &pLocale ) ; + encoding = osl_getTextEncodingFromLocale( pLocale ) ; + // CP end + + if( nType != FALSE ) + xPersonalCerts = xSecurityEnvironment->getPersonalCertificates() ; + else + return NULL; // not support then; + + length = xPersonalCerts.getLength(); + if(length == 0) + { + fprintf( stdout, "\nNo certificate found!\n" ) ; + return NULL; + } + + fprintf( stdout, "\nSelect a certificate:\n" ) ; + for( i = 0; i < length; i ++ ) + { + rtl::OUString xxxIssuer; + rtl::OUString xxxSubject; + rtl::OString yyyIssuer; + rtl::OString yyySubject; + + xxxIssuer=xPersonalCerts[i]->getIssuerName(); + yyyIssuer=rtl::OUStringToOString( xxxIssuer, encoding ); + + xxxSubject=xPersonalCerts[i]->getSubjectName(); + yyySubject=rtl::OUStringToOString( xxxSubject, encoding ); + + fprintf( stdout, "\n%d:\nsubject=[%s]\nissuer=[%s]\n", + i+1, + yyySubject.getStr(), + yyyIssuer.getStr()); + } + + int sel = QuerySelectNumber( 1, length ) -1; + return xPersonalCerts[sel] ; +} + +void QueryPrintSignatureDetails( const SignatureInformations& SignatureInformations, ::com::sun::star::uno::Reference< ::com::sun::star::xml::crypto::XSecurityEnvironment > rSecEnv ) +{ + char cShowDetails; + fprintf( stdout, "\nDisplay details (y/n) [y]?" ); + fflush(stdin); + fscanf( stdin, "%c", &cShowDetails); + if ( cShowDetails == 'y' ) + { + rtl_Locale *pLocale = NULL ; + osl_getProcessLocale( &pLocale ) ; + sal_uInt16 encoding = osl_getTextEncodingFromLocale( pLocale ) ; + + fprintf( stdout, "------------- Signature details START -------------\n" ); + fprintf( stdout, "%s", + rtl::OUStringToOString( + getSignatureInformations( SignatureInformations, rSecEnv), + encoding).getStr()); + + fprintf( stdout, "------------- Signature details END -------------\n" ); + } +} + +int QuerySelectNumber( int nMin, int nMax ) +{ + fprintf( stdout, "\n" ) ; + int sel = 0; + do + { + fprintf( stdout, "\nSelect <%d-%d>:", nMin, nMax ) ; + fflush(stdin); + fscanf( stdin, "%d", &sel ) ; + } while( ( sel < nMin ) || ( sel > nMax ) ); + + return sel; +} + +long QueryVerifySignature() +{ + char answer; + fprintf( stdout, "\nFound a signature - verify this one (y/n) [y]?" ); + fflush(stdin); + fscanf( stdin, "%c", &answer); + return (answer == 'n')?0:1; +} diff --git a/xmlsecurity/tools/demo/verifydemo.cxx b/xmlsecurity/tools/demo/verifydemo.cxx new file mode 100644 index 000000000000..8ebb9be086e1 --- /dev/null +++ b/xmlsecurity/tools/demo/verifydemo.cxx @@ -0,0 +1,112 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: verifydemo.cxx,v $ + * $Revision: 1.8 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_xmlsecurity.hxx" + +#include "util.hxx" + +#include <stdio.h> +#include <cppuhelper/servicefactory.hxx> + +#include <xmlsecurity/xmlsignaturehelper.hxx> + +using namespace ::com::sun::star; + +long startVerifyHandler( void *, void * ) +{ + return QueryVerifySignature(); +} + +int SAL_CALL main( int argc, char **argv ) +{ + if( argc < 2 ) + { + fprintf( stderr, "Usage: %s <signature file> [<cryptoken>]\n" , argv[0] ) ; + return -1 ; + } + + rtl::OUString aSIGFileName = rtl::OUString::createFromAscii(argv[1]); + rtl::OUString aCryptoToken; + if ( argc >= 3 ) + aCryptoToken = rtl::OUString::createFromAscii(argv[2]); + + uno::Reference< lang::XMultiServiceFactory > xMSF = CreateDemoServiceFactory(); + + + /* + * creates a signature helper + */ + XMLSignatureHelper aSignatureHelper( xMSF ); + + /* + * creates a security context. + */ + bool bInit = aSignatureHelper.Init( aCryptoToken ); + if ( !bInit ) + { + fprintf( stderr, "Error initializing security context!" ); + return -1; + } + + /* + * configures the start-verify handler + */ + aSignatureHelper.SetStartVerifySignatureHdl( Link( NULL, startVerifyHandler ) ); + + aSignatureHelper.StartMission(); + + /* + * verifies the signature + */ + uno::Reference< io::XInputStream > xInputStream = OpenInputStream( aSIGFileName ); + bool bDone = aSignatureHelper.ReadAndVerifySignature( xInputStream ); + + /* + * closes the signature stream + */ + xInputStream->closeInput(); + + if ( !bDone ) + { + fprintf( stderr, "\nSTATUS: Error verifying Signature!\n" ); + } + else + { + fprintf( stdout, "\nSTATUS: All choosen Signatures veryfied successfully!\n" ); + } + + aSignatureHelper.EndMission(); + + QueryPrintSignatureDetails( aSignatureHelper.GetSignatureInformations(), aSignatureHelper.GetSecurityEnvironment() ); + + return 0; +} + |