1*06b3ce53SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*06b3ce53SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*06b3ce53SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*06b3ce53SAndrew Rist * distributed with this work for additional information 6*06b3ce53SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*06b3ce53SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*06b3ce53SAndrew Rist * "License"); you may not use this file except in compliance 9*06b3ce53SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*06b3ce53SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*06b3ce53SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*06b3ce53SAndrew Rist * software distributed under the License is distributed on an 15*06b3ce53SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*06b3ce53SAndrew Rist * KIND, either express or implied. See the License for the 17*06b3ce53SAndrew Rist * specific language governing permissions and limitations 18*06b3ce53SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*06b3ce53SAndrew Rist *************************************************************/ 21*06b3ce53SAndrew Rist 22*06b3ce53SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_xmlsecurity.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include "util.hxx" 28cdf0e10cSrcweir 29cdf0e10cSrcweir #include <stdio.h> 30cdf0e10cSrcweir #include <tools/date.hxx> 31cdf0e10cSrcweir #include <tools/time.hxx> 32cdf0e10cSrcweir #include <cppuhelper/servicefactory.hxx> 33cdf0e10cSrcweir 34cdf0e10cSrcweir #include <xmlsecurity/biginteger.hxx> 35cdf0e10cSrcweir #include <xmlsecurity/xmlsignaturehelper.hxx> 36cdf0e10cSrcweir #include "xmlsecurity/baseencoding.hxx" 37cdf0e10cSrcweir 38cdf0e10cSrcweir using namespace ::com::sun::star; 39cdf0e10cSrcweir 40cdf0e10cSrcweir int SAL_CALL main( int argc, char **argv ) 41cdf0e10cSrcweir { 42cdf0e10cSrcweir if( argc < 4 ) 43cdf0e10cSrcweir { 44cdf0e10cSrcweir fprintf( stderr, "Usage: %s <signature file> <xml stream file> <binary stream file> [<cryptoken>]\n" , argv[0] ) ; 45cdf0e10cSrcweir return -1 ; 46cdf0e10cSrcweir } 47cdf0e10cSrcweir 48cdf0e10cSrcweir rtl::OUString aSIGFileName = rtl::OUString::createFromAscii(argv[1]); 49cdf0e10cSrcweir rtl::OUString aXMLFileName = rtl::OUString::createFromAscii(argv[2]); 50cdf0e10cSrcweir rtl::OUString aBINFileName = rtl::OUString::createFromAscii(argv[3]); 51cdf0e10cSrcweir rtl::OUString aCryptoToken; 52cdf0e10cSrcweir if ( argc >= 5 ) 53cdf0e10cSrcweir aCryptoToken = rtl::OUString::createFromAscii(argv[4]); 54cdf0e10cSrcweir 55cdf0e10cSrcweir uno::Reference< lang::XMultiServiceFactory > xMSF = CreateDemoServiceFactory(); 56cdf0e10cSrcweir 57cdf0e10cSrcweir /* 58cdf0e10cSrcweir * creates a signature helper 59cdf0e10cSrcweir */ 60cdf0e10cSrcweir XMLSignatureHelper aSignatureHelper( xMSF ); 61cdf0e10cSrcweir 62cdf0e10cSrcweir /* 63cdf0e10cSrcweir * creates a security context. 64cdf0e10cSrcweir */ 65cdf0e10cSrcweir bool bInit = aSignatureHelper.Init( aCryptoToken ); 66cdf0e10cSrcweir if ( !bInit ) 67cdf0e10cSrcweir { 68cdf0e10cSrcweir fprintf( stderr, "Error initializing security context!\n" ); 69cdf0e10cSrcweir return -1; 70cdf0e10cSrcweir } 71cdf0e10cSrcweir 72cdf0e10cSrcweir aSignatureHelper.StartMission(); 73cdf0e10cSrcweir 74cdf0e10cSrcweir /* 75cdf0e10cSrcweir * select a private key certificate 76cdf0e10cSrcweir */ 77cdf0e10cSrcweir sal_Int32 i; 78cdf0e10cSrcweir sal_Int32 nEnvCount = aSignatureHelper.GetSecurityEnvironmentNumber(); 79cdf0e10cSrcweir if( nEnvCount == 0 ) 80cdf0e10cSrcweir { 81cdf0e10cSrcweir fprintf( stdout, "\nNo SecurityEnvironment found!\n" ) ; 82cdf0e10cSrcweir return -1; 83cdf0e10cSrcweir } 84cdf0e10cSrcweir 85cdf0e10cSrcweir uno::Sequence< uno::Reference< xml::crypto::XSecurityEnvironment > > xSecurityEnvironments(nEnvCount) ; 86cdf0e10cSrcweir for( i=0; i < nEnvCount; i++ ) 87cdf0e10cSrcweir xSecurityEnvironments[i] = aSignatureHelper.GetSecurityEnvironmentByIndex(i); 88cdf0e10cSrcweir 89cdf0e10cSrcweir fprintf( stdout, "\nSelect a SecurityEnvironment:\n" ) ; 90cdf0e10cSrcweir for( i = 0; i < nEnvCount; i ++ ) 91cdf0e10cSrcweir fprintf( stdout, "\n[%d] %s", i+1, rtl::OUStringToOString( xSecurityEnvironments[i]->getSecurityEnvironmentInformation() ,RTL_TEXTENCODING_ASCII_US ).getStr()); 92cdf0e10cSrcweir 93cdf0e10cSrcweir sal_Int32 nEnvIndex = QuerySelectNumber( 1, nEnvCount ) -1; 94cdf0e10cSrcweir 95cdf0e10cSrcweir uno::Reference< ::com::sun::star::security::XCertificate > xPersonalCert = getCertificateFromEnvironment(xSecurityEnvironments[nEnvIndex], true); 96cdf0e10cSrcweir 97cdf0e10cSrcweir if ( !xPersonalCert.is() ) 98cdf0e10cSrcweir { 99cdf0e10cSrcweir fprintf( stdout, "No certificate choosen - exit.\n" ); 100cdf0e10cSrcweir return (-2); 101cdf0e10cSrcweir } 102cdf0e10cSrcweir 103cdf0e10cSrcweir /* 104cdf0e10cSrcweir * creates a new signature id 105cdf0e10cSrcweir */ 106cdf0e10cSrcweir sal_Int32 nSecurityId = aSignatureHelper.GetNewSecurityId(); 107cdf0e10cSrcweir 108cdf0e10cSrcweir /* 109cdf0e10cSrcweir * configures the X509 certificate 110cdf0e10cSrcweir */ 111cdf0e10cSrcweir aSignatureHelper.SetX509Certificate( 112cdf0e10cSrcweir nSecurityId, nEnvIndex, 113cdf0e10cSrcweir xPersonalCert->getIssuerName(), 114cdf0e10cSrcweir bigIntegerToNumericString( xPersonalCert->getSerialNumber()), 115cdf0e10cSrcweir baseEncode(xPersonalCert->getEncoded(), BASE64)); 116cdf0e10cSrcweir 117cdf0e10cSrcweir /* 118cdf0e10cSrcweir * configures date/time 119cdf0e10cSrcweir */ 120cdf0e10cSrcweir aSignatureHelper.SetDateTime( nSecurityId, Date(), Time()); 121cdf0e10cSrcweir 122cdf0e10cSrcweir /* 123cdf0e10cSrcweir * signs the xml stream 124cdf0e10cSrcweir */ 125cdf0e10cSrcweir aSignatureHelper.AddForSigning( nSecurityId, aXMLFileName, aXMLFileName, sal_False ); 126cdf0e10cSrcweir 127cdf0e10cSrcweir /* 128cdf0e10cSrcweir * signs the binary stream 129cdf0e10cSrcweir */ 130cdf0e10cSrcweir aSignatureHelper.AddForSigning( nSecurityId, aBINFileName, aBINFileName, sal_True ); 131cdf0e10cSrcweir 132cdf0e10cSrcweir /* 133cdf0e10cSrcweir * creates signature 134cdf0e10cSrcweir */ 135cdf0e10cSrcweir uno::Reference< io::XOutputStream > xOutputStream = OpenOutputStream( aSIGFileName ); 136cdf0e10cSrcweir bool bDone = aSignatureHelper.CreateAndWriteSignature( xOutputStream ); 137cdf0e10cSrcweir 138cdf0e10cSrcweir if ( !bDone ) 139cdf0e10cSrcweir { 140cdf0e10cSrcweir fprintf( stderr, "\nSTATUS: Error creating Signature!\n" ); 141cdf0e10cSrcweir } 142cdf0e10cSrcweir else 143cdf0e10cSrcweir { 144cdf0e10cSrcweir fprintf( stdout, "\nSTATUS: Signature successfully created!\n" ); 145cdf0e10cSrcweir } 146cdf0e10cSrcweir 147cdf0e10cSrcweir aSignatureHelper.EndMission(); 148cdf0e10cSrcweir 149cdf0e10cSrcweir QueryPrintSignatureDetails( aSignatureHelper.GetSignatureInformations(), aSignatureHelper.GetSecurityEnvironment() ); 150cdf0e10cSrcweir 151cdf0e10cSrcweir return 0; 152cdf0e10cSrcweir } 153cdf0e10cSrcweir 154