sl@0: /*
sl@0: * Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
sl@0: * All rights reserved.
sl@0: * This component and the accompanying materials are made available
sl@0: * under the terms of the License "Eclipse Public License v1.0"
sl@0: * which accompanies this distribution, and is available
sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0: *
sl@0: * Initial Contributors:
sl@0: * Nokia Corporation - initial contribution.
sl@0: *
sl@0: * Contributors:
sl@0: *
sl@0: * Description: 
sl@0: * Example CTestStep derived implementation
sl@0: *
sl@0: */
sl@0: 
sl@0: 
sl@0: /**
sl@0:  @file
sl@0:  @internalTechnology
sl@0: */
sl@0: #include "signerverifierstep.h"
sl@0: 
sl@0: #include <cryptospi/keypair.h>
sl@0: #include <cryptospi/cryptosignatureapi.h>
sl@0: #include <cryptospi/cryptokeypairgeneratorapi.h>
sl@0: 
sl@0: using namespace CryptoSpi;
sl@0: 
sl@0: 
sl@0: CSignerVerifierStep::~CSignerVerifierStep()
sl@0: 	{
sl@0: 	}
sl@0: 
sl@0: CSignerVerifierStep::CSignerVerifierStep()
sl@0: 	{
sl@0: 	SetTestStepName(KSignerVerifierStep);
sl@0: 	}
sl@0: 
sl@0: TVerdict CSignerVerifierStep::doTestStepPreambleL()
sl@0: 	{
sl@0: 	SetTestStepResult(EPass);
sl@0: 	return TestStepResult();
sl@0: 	}
sl@0: 
sl@0: 
sl@0: TVerdict CSignerVerifierStep::doTestStepL()
sl@0: 	{
sl@0: 	INFO_PRINTF1(_L("*** Signer/Verifier - Signature and Verification ***"));
sl@0: 	INFO_PRINTF2(_L("HEAP CELLS: %d"), User::CountAllocCells());
sl@0: 	
sl@0:   	if (TestStepResult()==EPass)
sl@0: 		{
sl@0: 		//Assume faliure, unless all is successful
sl@0: 		SetTestStepResult(EFail);
sl@0: 		
sl@0: 		TVariantPtrC testVariant;
sl@0: 		TVariantPtrC typeVariant;
sl@0: 		TVariantPtrC dataVariant;
sl@0: 
sl@0: 		if(	!GetStringFromConfig(ConfigSection(),KConfigSignVerifyType, typeVariant) 
sl@0: 			|| !GetStringFromConfig(ConfigSection(),KConfigSignVerifyData, dataVariant))
sl@0: 			{
sl@0: 			// Leave if there's any error.
sl@0: 			User::Leave(KErrNotFound);
sl@0: 			}
sl@0: 		else
sl@0: 			{
sl@0: 			TUid sigType = typeVariant;
sl@0: 						
sl@0: 			//Construct a Crypto Parameters object to store the necessary key pair generator parameters
sl@0: 			CCryptoParams* keyParams = CCryptoParams::NewL();
sl@0: 			CleanupStack::PushL(keyParams);
sl@0: 
sl@0: 			//Create Key Pair Generator Object
sl@0: 			CKeyPairGenerator * keypairImpl = NULL;
sl@0: 			
sl@0: 			//Define error code as first TRAP is beyond scope
sl@0: 			TInt err = 0;
sl@0: 			
sl@0: 			if (sigType == KRsaSignerUid)			
sl@0: 				{
sl@0: 				INFO_PRINTF1(_L("Creating Key Pair Generator (RSA)..."));
sl@0: 
sl@0: 				keyParams->AddL(KKeyExponent, KRsaKeyParameterEUid);
sl@0: 				keyParams->AddL(KRsaPrivateKeyStandard, KRsaKeyTypeUid);
sl@0: 				
sl@0: 				//Construct an 'RSA' Key Pair Generator Implementation Object
sl@0: 				TRAP_LOG(err,CKeyPairGeneratorFactory::CreateKeyPairGeneratorL(keypairImpl, 
sl@0: 																KRSAKeyPairGeneratorUid, 
sl@0: 																keyParams));
sl@0: 				}
sl@0: 			else
sl@0: 				{
sl@0: 				INFO_PRINTF1(_L("Creating Key Pair Generator (DSA)..."));
sl@0: 				
sl@0: 				//Construct a 'DSA' Key Pair Generator Implementation Object
sl@0: 				TRAP_LOG(err,CKeyPairGeneratorFactory::CreateKeyPairGeneratorL(keypairImpl,
sl@0:                                             					KDSAKeyPairGeneratorUid,
sl@0:                                             					NULL));
sl@0: 				}
sl@0: 				
sl@0: 			CleanupStack::PushL(keypairImpl);
sl@0: 	
sl@0: 			// Generate a Key Pair 
sl@0: 			INFO_PRINTF1(_L("Generating Key Pair..."));
sl@0: 			
sl@0: 			CKeyPair* keyPair = NULL;
sl@0: 				
sl@0: 			TRAP_LOG(err,keypairImpl->GenerateKeyPairL(1024, 
sl@0: 													*keyParams, 
sl@0: 													keyPair));
sl@0: 
sl@0: 			CleanupStack::PushL(keyPair);
sl@0: 			
sl@0: 			
sl@0: 			// Create a Signer Object	
sl@0: 			INFO_PRINTF1(_L("Creating Signer Object..."));
sl@0: 			CCryptoParams* svParams = CCryptoParams::NewL();
sl@0: 			CleanupStack::PushL(svParams);
sl@0: 
sl@0: 			CSigner * implsig = NULL;	
sl@0: 		    TRAP_LOG(err,CSignatureFactory::CreateSignerL(implsig,
sl@0: 													   sigType,
sl@0: 													   keyPair->PublicKey(),
sl@0: 													   KPaddingModePkcs1_v1_5_SignatureUid,
sl@0: 													   svParams));
sl@0: 										   
sl@0: 			CleanupStack::PushL(implsig);
sl@0: 		
sl@0: 		
sl@0: 			// Create a Verifier
sl@0: 			INFO_PRINTF1(_L("Creating Verifier Object..."));
sl@0: 			
sl@0: 			CVerifier * implver = NULL;	
sl@0: 		    TRAP_LOG(err,CSignatureFactory::CreateVerifierL(implver,
sl@0: 										   				sigType == KRsaSignerUid ? KRsaVerifierUid : KDsaVerifierUid,
sl@0: 										   				keyPair->PrivateKey(),
sl@0: 										   				KPaddingModePkcs1_v1_5_SignatureUid,
sl@0: 										   				svParams));
sl@0: 										   				
sl@0: 			CleanupStack::PushL(implver);
sl@0: 										   
sl@0: 			//Define a new signature object
sl@0: 			CCryptoParams *signature = CCryptoParams::NewL();
sl@0: 			CleanupStack::PushL(signature);
sl@0: 
sl@0: 			//Convert the source data to an 8 Bit Descriptor
sl@0: 			HBufC8* sourceData = HBufC8::NewLC(dataVariant.Length());
sl@0: 			TPtr8 sourceDataPtr = sourceData->Des();
sl@0: 			
sl@0: 			sourceDataPtr.Copy(dataVariant);
sl@0: 			
sl@0: 			//Set the signer object to use the 'Private' Key of the key pair
sl@0: 			INFO_PRINTF1(_L("Setting Signer Private Key..."));
sl@0: 			TRAP_LOG(err,implsig->SetKeyL(keyPair->PrivateKey()));
sl@0: 			
sl@0: 			//Generate a signature for the source data
sl@0: 			INFO_PRINTF1(_L("Signing..."));
sl@0: 			TRAP_LOG(err,implsig->SignL(*sourceData, *signature));
sl@0:     	
sl@0:     		TBool bResult = EFalse;	
sl@0:     		
sl@0:     		//Set the verifier object to use the 'Public' Key of the key pair
sl@0:     		INFO_PRINTF1(_L("Setting Verifier Public Key..."));
sl@0: 			TRAP_LOG(err,implver->SetKeyL(keyPair->PublicKey()));
sl@0: 			
sl@0: 			//Verify that the generated signature is valid for the given data
sl@0: 			INFO_PRINTF1(_L("Verifying..."));
sl@0: 			TRAP_LOG(err,implver->VerifyL(*sourceData, *signature, bResult));
sl@0: 
sl@0: 			if (bResult)
sl@0: 				{
sl@0: 				// verifier agrees signature is valid
sl@0: 				INFO_PRINTF1(_L("PASS: Verification of Generated Signature Successful"));
sl@0: 				SetTestStepResult(EPass);
sl@0: 				}
sl@0: 			else
sl@0: 				{
sl@0: 				//verification failure, signature is invalid
sl@0: 				ERR_PRINTF2(_L("FAIL: Verification Failure of Generated Signature - %d"), err);
sl@0: 				SetTestStepResult(EFail);
sl@0: 				}
sl@0: 			
sl@0: 			CleanupStack::PopAndDestroy(sourceData);	
sl@0: 			CleanupStack::PopAndDestroy(signature);
sl@0: 			CleanupStack::PopAndDestroy(implver);
sl@0: 			CleanupStack::PopAndDestroy(implsig);
sl@0: 			CleanupStack::PopAndDestroy(svParams);
sl@0: 			
sl@0: 			CleanupStack::PopAndDestroy(keyPair);
sl@0: 			CleanupStack::PopAndDestroy(keypairImpl);
sl@0: 			CleanupStack::PopAndDestroy(keyParams);
sl@0: 			}
sl@0: 
sl@0: 		INFO_PRINTF2(_L("HEAP CELLS: %d"), User::CountAllocCells());
sl@0: 		
sl@0: 		}
sl@0: 	  return TestStepResult();
sl@0: 	}
sl@0: 
sl@0: 
sl@0: 
sl@0: TVerdict CSignerVerifierStep::doTestStepPostambleL()
sl@0: 	{
sl@0: 	return TestStepResult();
sl@0: 	}