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: }