sl@0: /* sl@0: * Copyright (c) 1998-2009 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: * sl@0: */ sl@0: sl@0: sl@0: #include "trsasignfb.h" sl@0: #include "t_input.h" sl@0: #include sl@0: #include sl@0: #include sl@0: #include "performancetest.h" sl@0: sl@0: _LIT8(KInputStart, ""); sl@0: _LIT8(KKeyBitsStart, ""); sl@0: _LIT8(KKeyBitsEnd, ""); sl@0: sl@0: CRSASignFB::~CRSASignFB() sl@0: { sl@0: delete iBody; sl@0: } sl@0: sl@0: CRSASignFB::CRSASignFB(RFs& aFs, CConsoleBase& aConsole, Output& aOut) sl@0: : CTestAction(aConsole, aOut), iFs(aFs), iPerfTestIterations(100) sl@0: { sl@0: } sl@0: sl@0: CTestAction* CRSASignFB::NewL(RFs& aFs, CConsoleBase& aConsole, Output& aOut, sl@0: const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: CTestAction* self = CRSASignFB::NewLC(aFs, aConsole, sl@0: aOut, aTestActionSpec); sl@0: CleanupStack::Pop(); sl@0: return self; sl@0: } sl@0: sl@0: CTestAction* CRSASignFB::NewLC(RFs& aFs, CConsoleBase& aConsole, Output& aOut, sl@0: const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: CRSASignFB* self = new(ELeave) CRSASignFB(aFs, aConsole, aOut); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aTestActionSpec); sl@0: return self; sl@0: } sl@0: sl@0: sl@0: TRSAPrivateKeyType CRSASignFB::TypeOfCrypto() sl@0: { sl@0: return iCryptoType; sl@0: } sl@0: sl@0: void CRSASignFB::ConstructL(const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: CTestAction::ConstructL(aTestActionSpec); sl@0: iBody = HBufC8::NewL(aTestActionSpec.iActionBody.Length()); sl@0: iBody->Des().Copy(aTestActionSpec.iActionBody); sl@0: sl@0: if (CPerformance::PerformanceTester()->IsTestingPerformance()) sl@0: {// Number of test iterations sl@0: TPtrC8 itsPtr = Input::ParseElement(aTestActionSpec.iActionBody, KIterationsStart, KIterationsEnd); sl@0: if (itsPtr!=KNullDesC8) sl@0: { sl@0: TLex8 lex; sl@0: lex.Assign(itsPtr); sl@0: User::LeaveIfError(lex.Val(iPerfTestIterations)); sl@0: if (iPerfTestIterations > KMaxIterations) sl@0: User::Panic(_L("AsymmetricPerformance.exe"), KErrArgument); sl@0: sl@0: } sl@0: TPtrC8 cryptoPtr = Input::ParseElement(aTestActionSpec.iActionBody, KTypeOfCryptoStart, KTypeOfCryptoEnd); sl@0: if (cryptoPtr.CompareF(KRSAStandard) == 0) sl@0: { sl@0: iCryptoType = EStandard; sl@0: } sl@0: else if (cryptoPtr.CompareF(KRSAStandardCRT) == 0) sl@0: { sl@0: iCryptoType = EStandardCRT; sl@0: } sl@0: else sl@0: { sl@0: User::Panic(_L("AsymmetricPerformance.exe"), KErrArgument); sl@0: } sl@0: } sl@0: sl@0: TPtrC8 keyBitsPtr = Input::ParseElement(*iBody, KKeyBitsStart, KKeyBitsEnd); sl@0: if (keyBitsPtr!=KNullDesC8) sl@0: { sl@0: TLex8 lex; sl@0: lex.Assign(keyBitsPtr); sl@0: User::LeaveIfError(lex.Val(iKeyBits)); sl@0: } sl@0: } sl@0: sl@0: void CRSASignFB::DoPerformPrerequisite(TRequestStatus& aStatus) sl@0: { sl@0: TRequestStatus* status = &aStatus; sl@0: sl@0: HBufC8* input = Input::ParseElementHexL(*iBody, KInputStart); sl@0: CleanupStack::PushL(input); sl@0: iSigInput = CHashingSignatureInput::NewL(CMessageDigest::ESHA1); sl@0: iSigInput->Update(*input); sl@0: iInput = iSigInput->Final().AllocL(); sl@0: CleanupStack::PopAndDestroy(input); sl@0: sl@0: User::RequestComplete(status, KErrNone); sl@0: iActionState = CTestAction::EAction; sl@0: } sl@0: sl@0: void CRSASignFB::DoPerformPostrequisite(TRequestStatus& aStatus) sl@0: { sl@0: TRequestStatus* status = &aStatus; sl@0: delete iInput; sl@0: delete iSigInput; sl@0: sl@0: iFinished = ETrue; sl@0: User::RequestComplete(status, iActionResult); sl@0: } sl@0: sl@0: void CRSASignFB::DoReportAction(void) sl@0: { sl@0: } sl@0: sl@0: void CRSASignFB::DoCheckResult(TInt) sl@0: { sl@0: if (iResult) sl@0: iConsole.Printf(_L(".")); sl@0: else sl@0: iConsole.Printf(_L("X")); sl@0: } sl@0: sl@0: void CRSASignFB::Hex(HBufC8& aString) sl@0: { sl@0: TPtr8 ptr=aString.Des(); sl@0: if (aString.Length()%2) sl@0: { sl@0: ptr.SetLength(0); sl@0: return; sl@0: } sl@0: TInt i; sl@0: for (i=0;i'9'?('A'-10):'0')); sl@0: tmp*=16; sl@0: tmp|=(TUint8)(aString[i+1]-(aString[i+1]>'9'?('A'-10):'0')); sl@0: ptr[i/2]=tmp; sl@0: } sl@0: ptr.SetLength(aString.Length()/2); sl@0: } sl@0: sl@0: void CRSASignFB::PerformAction(TRequestStatus& aStatus) sl@0: { sl@0: TRequestStatus* status = &aStatus; sl@0: sl@0: if (CPerformance::PerformanceTester()->IsTestingPerformance()) sl@0: { sl@0: iConsole.Printf(_L(">")); // Indicates start of test sl@0: TRAP(iActionResult, DoPerformanceTestActionL()); sl@0: } sl@0: else sl@0: { sl@0: TRAP(iActionResult, DoPerformActionL()); sl@0: } sl@0: sl@0: if (iActionResult==KErrNoMemory) sl@0: User::Leave(iActionResult); // For OOM testing sl@0: sl@0: User::RequestComplete(status, iActionResult); sl@0: iActionState = CTestAction::EPostrequisite; sl@0: } sl@0: sl@0: sl@0: void CRSASignFB::DoPerformanceTestActionL() sl@0: { sl@0: __UHEAP_MARK; sl@0: iResult = EFalse; sl@0: sl@0: TTimeIntervalMicroSeconds keyCreateTime(0); sl@0: TTimeIntervalMicroSeconds signTime(0); sl@0: TTimeIntervalMicroSeconds verifyTime(0); sl@0: TTime start, end; sl@0: TTimeIntervalSeconds diff(0); sl@0: const TTimeIntervalSeconds KIterationTime(iPerfTestIterations); sl@0: sl@0: // Time key pair creation sl@0: CRSAKeyPair *rsaPair = NULL; sl@0: TUint noRSAPairs = 0; sl@0: start.UniversalTime(); sl@0: while (diff < KIterationTime) sl@0: { sl@0: rsaPair = CRSAKeyPair::NewLC(iKeyBits, TypeOfCrypto()); sl@0: CleanupStack::PopAndDestroy(); sl@0: noRSAPairs++; sl@0: end.UniversalTime(); sl@0: end.SecondsFrom(start, diff); sl@0: } sl@0: end.UniversalTime(); sl@0: keyCreateTime = end.MicroSecondsFrom(start); sl@0: TReal keycreatetime = I64REAL(keyCreateTime.Int64()); sl@0: sl@0: rsaPair=CRSAKeyPair::NewLC(iKeyBits, TypeOfCrypto()); // Create one keypair for operations sl@0: sl@0: CRSAPKCS1v15Signer* signer = CRSAPKCS1v15Signer::NewL(rsaPair->PrivateKey()); sl@0: CleanupStack::PushL(signer); sl@0: CRSAPKCS1v15Verifier* verifier = CRSAPKCS1v15Verifier::NewL(rsaPair->PublicKey()); sl@0: CleanupStack::PushL(verifier); sl@0: sl@0: const CRSASignature *testSig; sl@0: sl@0: // Time signing sl@0: diff = 0; sl@0: TInt noSignings = 0; sl@0: start.UniversalTime(); sl@0: while (diff < KIterationTime) sl@0: { sl@0: testSig = signer->SignL(*iInput); sl@0: delete testSig; sl@0: noSignings++; sl@0: end.UniversalTime(); sl@0: end.SecondsFrom(start, diff); sl@0: } sl@0: end.UniversalTime(); sl@0: signTime = end.MicroSecondsFrom(start); sl@0: TReal signtime = I64REAL(signTime.Int64()); sl@0: // Time verification sl@0: TInt noVerifies = 0; sl@0: diff = 0; sl@0: testSig = signer->SignL(*iInput); sl@0: CleanupStack::PushL(const_cast(testSig)); sl@0: start.UniversalTime(); sl@0: while (diff < KIterationTime) sl@0: { sl@0: iResult = verifier->VerifyL(*iInput, *testSig); sl@0: sl@0: // do as many verfies as possible sl@0: if (!iResult) sl@0: { sl@0: break; sl@0: } sl@0: noVerifies++; sl@0: end.UniversalTime(); sl@0: end.SecondsFrom(start, diff); sl@0: } sl@0: end.UniversalTime(); sl@0: verifyTime = end.MicroSecondsFrom(start); sl@0: TReal verifytime = I64REAL(verifyTime.Int64()); sl@0: CleanupStack::PopAndDestroy(4); // verifier,signer,testSig,rsaPairs sl@0: __UHEAP_MARKEND; sl@0: sl@0: if (iResult) sl@0: { sl@0: TBuf<256> buf; sl@0: TReal rate = I64REAL(keyCreateTime.Int64()) / noRSAPairs; sl@0: sl@0: _LIT(KKeyCreateTime, "\n\tKeyCreate: %f us/key creation (no creations: %i in %f us)\r\n"); sl@0: buf.Format(KKeyCreateTime, rate, noRSAPairs, keycreatetime); sl@0: iOut.writeString(buf); sl@0: sl@0: rate = I64REAL(signTime.Int64()) / noSignings; sl@0: _LIT(KSignTime, "\tSigning: %f us/signing (no signings: %i in %f us)\r\n"); sl@0: buf.Format(KSignTime, rate, noSignings, signtime); sl@0: iOut.writeString(buf); sl@0: sl@0: rate = I64REAL(verifyTime.Int64()) / noVerifies; sl@0: _LIT(KVerifyTime, "\tVerifying: %f us/verify (no verfies: %i in %f us)\r\n"); sl@0: buf.Format(KVerifyTime, rate, noVerifies, verifytime); sl@0: iOut.writeString(buf); sl@0: } sl@0: else sl@0: { sl@0: _LIT(KNoTimingInfo, "\tTest Failed! No benchmark data\n"); sl@0: iOut.writeString(KNoTimingInfo); sl@0: } sl@0: } sl@0: sl@0: void CRSASignFB::DoPerformActionL() sl@0: { sl@0: __UHEAP_MARK; sl@0: sl@0: iResult = EFalse; sl@0: sl@0: CRSAKeyPair* rsaPair = CRSAKeyPair::NewLC(512, TypeOfCrypto()); sl@0: sl@0: CRSAPKCS1v15Signer* signer = CRSAPKCS1v15Signer::NewL(rsaPair->PrivateKey()); sl@0: CleanupStack::PushL(signer); sl@0: sl@0: CRSAPKCS1v15Verifier* verifier = CRSAPKCS1v15Verifier::NewL(rsaPair->PublicKey()); sl@0: CleanupStack::PushL(verifier); sl@0: sl@0: const CRSASignature* signature = signer->SignL(*iInput); sl@0: CleanupStack::PushL(const_cast(signature)); sl@0: sl@0: if(verifier->VerifyL(*iInput, *signature)) sl@0: { sl@0: iResult = ETrue; sl@0: } sl@0: sl@0: CleanupStack::PopAndDestroy(4, rsaPair); //signature, verifier, signer, rsaPair sl@0: sl@0: __UHEAP_MARKEND; sl@0: } sl@0: