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 "trsaencryptfb.h" sl@0: #include "t_input.h" sl@0: #include sl@0: #include sl@0: #include sl@0: #include "performancetest.h" sl@0: #include sl@0: sl@0: _LIT8(KInputStart, ""); sl@0: _LIT8(KInputEnd, ""); sl@0: _LIT8(KKeyBitsStart, ""); sl@0: _LIT8(KKeyBitsEnd, ""); sl@0: sl@0: CRSAEncryptFB::~CRSAEncryptFB() sl@0: { sl@0: delete iBody; sl@0: } sl@0: sl@0: CRSAEncryptFB::CRSAEncryptFB(RFs& aFs, CConsoleBase& aConsole, Output& aOut) sl@0: : CTestAction(aConsole, aOut), iFs(aFs), iKeyBits(512) // Default key size = 512 sl@0: { sl@0: } sl@0: sl@0: CTestAction* CRSAEncryptFB::NewL(RFs& aFs, CConsoleBase& aConsole, Output& aOut, sl@0: const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: CTestAction* self = CRSAEncryptFB::NewLC(aFs, aConsole, sl@0: aOut, aTestActionSpec); sl@0: CleanupStack::Pop(); sl@0: return self; sl@0: } sl@0: sl@0: CTestAction* CRSAEncryptFB::NewLC(RFs& aFs, CConsoleBase& aConsole,Output& aOut, sl@0: const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: CRSAEncryptFB* self = new(ELeave) CRSAEncryptFB(aFs, aConsole, aOut); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aTestActionSpec); sl@0: return self; sl@0: } sl@0: sl@0: void CRSAEncryptFB::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: 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 CRSAEncryptFB::DoPerformPrerequisite(TRequestStatus& aStatus) sl@0: { sl@0: TRequestStatus* status = &aStatus; sl@0: sl@0: TPtrC8 inputTemp = Input::ParseElement(*iBody, KInputStart, KInputEnd); sl@0: iInput = HBufC8::NewL(inputTemp.Length()); sl@0: *iInput = inputTemp; sl@0: Hex(*iInput); sl@0: sl@0: User::RequestComplete(status, KErrNone); sl@0: iActionState = CTestAction::EAction; sl@0: } sl@0: sl@0: void CRSAEncryptFB::DoPerformPostrequisite(TRequestStatus& aStatus) sl@0: { sl@0: TRequestStatus* status = &aStatus; sl@0: delete iInput; sl@0: sl@0: iFinished = ETrue; sl@0: User::RequestComplete(status, iActionResult); sl@0: } sl@0: sl@0: void CRSAEncryptFB::DoReportAction(void) sl@0: { sl@0: } sl@0: sl@0: void CRSAEncryptFB::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 CRSAEncryptFB::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: sl@0: void CRSAEncryptFB::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: { sl@0: User::Leave(iActionResult); // For OOM testing sl@0: } sl@0: if (iActionResult==KErrKeyNotWeakEnough) sl@0: { sl@0: iResult = ETrue; sl@0: iConsole.Printf(_L("Crypto libraries returned KErrKeyNotWeakEnough! Passing test automatically.\n\r")); sl@0: iOut.writeString(_L("Crypto libraries returned KErrKeyNotWeakEnough! Passing test automatically.\r\n")); sl@0: } sl@0: sl@0: User::RequestComplete(status, iActionResult); sl@0: sl@0: iActionState = CTestAction::EPostrequisite; sl@0: } sl@0: sl@0: void CRSAEncryptFB::DoPerformanceTestActionL() sl@0: { sl@0: __UHEAP_MARK; sl@0: iResult = EFalse; sl@0: sl@0: TTimeIntervalMicroSeconds keyCreateTime(0); sl@0: TTimeIntervalMicroSeconds encryptTime(0); sl@0: TTimeIntervalMicroSeconds decryptTime(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: TInt noKeyPairCreations = 0; sl@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: noKeyPairCreations++; 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: CRSAPKCS1v15Encryptor* encryptor = CRSAPKCS1v15Encryptor::NewL(rsaPair->PublicKey()); sl@0: CleanupStack::PushL(encryptor); sl@0: sl@0: CRSAPKCS1v15Decryptor* decryptor = CRSAPKCS1v15Decryptor::NewL(rsaPair->PrivateKey()); sl@0: CleanupStack::PushL(decryptor); sl@0: sl@0: HBufC8 *eResult = HBufC8::NewLC(encryptor->MaxOutputLength()); sl@0: TPtr8 ePtr = eResult->Des(); sl@0: TPtr8* eResultPtr = &ePtr; sl@0: sl@0: sl@0: // Time encryption sl@0: diff = 0; sl@0: TInt noEncryptions = 0; sl@0: start.UniversalTime(); sl@0: while (diff < KIterationTime) sl@0: { sl@0: eResultPtr->Zero(); sl@0: encryptor->EncryptL(*iInput, *eResultPtr); sl@0: noEncryptions++; sl@0: end.UniversalTime(); sl@0: end.SecondsFrom(start, diff); sl@0: } sl@0: end.UniversalTime(); sl@0: encryptTime = end.MicroSecondsFrom(start); sl@0: TReal encrypttime = I64REAL(encryptTime.Int64()); sl@0: sl@0: // Time decryption sl@0: diff = 0; sl@0: HBufC8 *dResult = HBufC8::NewLC(decryptor->MaxOutputLength()); sl@0: ePtr = eResult->Des(); sl@0: eResultPtr = &ePtr; sl@0: TPtr8 dPtr = dResult->Des(); sl@0: TPtr8* dResultPtr = &dPtr; sl@0: TInt noDecryptions = 0; sl@0: start.UniversalTime(); sl@0: while (diff < KIterationTime) sl@0: { sl@0: decryptor->DecryptL(*eResultPtr, *dResultPtr); sl@0: noDecryptions++; sl@0: end.UniversalTime(); sl@0: end.SecondsFrom(start, diff); sl@0: } sl@0: end.UniversalTime(); sl@0: decryptTime = end.MicroSecondsFrom(start); sl@0: TReal decrypttime = I64REAL(decryptTime.Int64()); sl@0: sl@0: iResult = ETrue; sl@0: if (*iInput != *dResult) sl@0: { sl@0: iResult = EFalse; sl@0: } sl@0: sl@0: CleanupStack::PopAndDestroy(5); // dResult,eResult,decryptor,encryptor,rsaPair sl@0: __UHEAP_MARKEND; sl@0: sl@0: if (iResult) sl@0: { sl@0: TReal rate = I64REAL(keyCreateTime.Int64()) / noKeyPairCreations; sl@0: TBuf<256> buf; sl@0: _LIT(KKeyCreateTime, "\n\tKeyCreate: %f us/key pair (%i key pairs in %f us)\r\n"); sl@0: buf.Format(KKeyCreateTime, rate, noKeyPairCreations, keycreatetime); sl@0: iOut.writeString(buf); sl@0: sl@0: rate = I64REAL(encryptTime.Int64()) / noEncryptions; sl@0: _LIT(KEncryptTime, "\tEncrypt: %f us/encryption (%i encryptions in %f us)\r\n"); sl@0: buf.Format(KEncryptTime, rate, noEncryptions, encrypttime); sl@0: iOut.writeString(buf); sl@0: sl@0: rate = I64REAL(decryptTime.Int64()) / noDecryptions; sl@0: _LIT(KDecryptTime, "\tDecrypt: %f us/decryption (%i decryptions in %f us)\r\n"); sl@0: buf.Format(KDecryptTime, rate, noDecryptions, decrypttime); 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 CRSAEncryptFB::DoPerformActionL() sl@0: { sl@0: __UHEAP_MARK; sl@0: sl@0: iResult = EFalse; sl@0: sl@0: CRSAKeyPair* rsaPair = CRSAKeyPair::NewLC(iKeyBits, TypeOfCrypto()); sl@0: //LogKeyData(static_cast(&rsaPair->PublicKey()), static_cast(&rsaPair->PrivateKey()), KNullDesC8); sl@0: sl@0: CRSAPKCS1v15Encryptor* encryptor = CRSAPKCS1v15Encryptor::NewL(rsaPair->PublicKey()); sl@0: CleanupStack::PushL(encryptor); sl@0: sl@0: CRSAPKCS1v15Decryptor* decryptor = CRSAPKCS1v15Decryptor::NewL(rsaPair->PrivateKey()); sl@0: CleanupStack::PushL(decryptor); sl@0: sl@0: HBufC8* eResult = HBufC8::NewLC(encryptor->MaxOutputLength()); sl@0: HBufC8* dResult = HBufC8::NewLC(decryptor->MaxOutputLength()); sl@0: sl@0: TPtr8 eResultPtr = eResult->Des(); sl@0: encryptor->EncryptL(*iInput, eResultPtr); sl@0: sl@0: TPtr8 dResultPtr = dResult->Des(); sl@0: if (TypeOfCrypto() == EStandardCRT) sl@0: { sl@0: TRAPD(res, decryptor->DecryptL(eResultPtr, dResultPtr)); sl@0: if (res==KErrCorrupt) // Log all the key data for this failure sl@0: LogKeyData(static_cast(&rsaPair->PublicKey()), static_cast(&rsaPair->PrivateKey()), *eResult); sl@0: sl@0: User::LeaveIfError(res); sl@0: } sl@0: else sl@0: { sl@0: decryptor->DecryptL(eResultPtr, dResultPtr); sl@0: } sl@0: sl@0: if(*iInput == *dResult) sl@0: { sl@0: iResult = ETrue; sl@0: } sl@0: sl@0: CleanupStack::PopAndDestroy(dResult); sl@0: CleanupStack::PopAndDestroy(eResult); sl@0: CleanupStack::PopAndDestroy(decryptor); sl@0: CleanupStack::PopAndDestroy(encryptor); sl@0: CleanupStack::PopAndDestroy(rsaPair); sl@0: sl@0: __UHEAP_MARKEND; sl@0: } sl@0: sl@0: void CRSAEncryptFB::LogKeyData(const CRSAPublicKey* aPublicKey, const CRSAPrivateKeyCRT* aPrivateKeyCRT, const TDesC8& aCipherText) sl@0: { sl@0: iOut.writeString(_L("\n\t ----------- e -----------\n\r")); sl@0: const TInteger& keyE = aPublicKey->E(); sl@0: HBufC8* theE = keyE.BufferLC(); sl@0: iOut.writeOctetString(*theE); sl@0: sl@0: iOut.writeString(_L("\n\t ----------- P -----------\n\r")); sl@0: const TInteger& keyP = aPrivateKeyCRT->P(); sl@0: HBufC8* theP = keyP.BufferLC(); sl@0: iOut.writeOctetString(*theP); sl@0: sl@0: iOut.writeString(_L("\n\t ----------- Q -----------\n\r")); sl@0: const TInteger& keyQ = aPrivateKeyCRT->Q(); sl@0: HBufC8* theQ = keyQ.BufferLC(); sl@0: iOut.writeOctetString(*theQ); sl@0: sl@0: iOut.writeString(_L("\n\t ----------- DP -----------\n\r")); sl@0: const TInteger& keyDP = aPrivateKeyCRT->DP(); sl@0: HBufC8* theDP = keyDP.BufferLC(); sl@0: iOut.writeOctetString(*theDP); sl@0: sl@0: iOut.writeString(_L("\n\t ----------- DQ -----------\n\r")); sl@0: const TInteger& keyDQ = aPrivateKeyCRT->DQ(); sl@0: HBufC8* theDQ = keyDQ.BufferLC(); sl@0: iOut.writeOctetString(*theDQ); sl@0: sl@0: iOut.writeString(_L("\n\t ----------- QInv -----------\n\r")); sl@0: const TInteger& keyQInv = aPrivateKeyCRT->QInv(); sl@0: HBufC8* theQInv = keyQInv.BufferLC(); sl@0: iOut.writeOctetString(*theQInv); sl@0: sl@0: iOut.writeString(_L("\n\t ----------- N -----------\n\r")); sl@0: const TInteger& keyN = aPrivateKeyCRT->N(); sl@0: HBufC8* theN = keyN.BufferLC(); sl@0: iOut.writeOctetString(*theN); sl@0: sl@0: iOut.writeString(_L("\n\t ----------- ciphertext -----------\n\r")); sl@0: iOut.writeOctetString(aCipherText); sl@0: sl@0: iOut.writeString(_L("\n\t -------------------------\n\r")); sl@0: sl@0: CleanupStack::PopAndDestroy(6); sl@0: sl@0: }