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 "cryptotestaction.h" sl@0: #include sl@0: #include sl@0: #include "../common/inlines.h" sl@0: #include "t_output.h" sl@0: sl@0: CCryptoTestAction::CCryptoTestAction(RFs& aFs, CConsoleBase& aConsole, Output& aOut) sl@0: : CTestAction(aConsole, aOut), iFs(aFs), iEffectiveKeyLen(128) sl@0: {} sl@0: sl@0: CCryptoTestAction::~CCryptoTestAction() sl@0: { sl@0: delete iBody; sl@0: } sl@0: sl@0: void CCryptoTestAction::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: sl@0: void CCryptoTestAction::DoPerformPrerequisite(TRequestStatus& aStatus) sl@0: { sl@0: TRequestStatus* status = &aStatus; sl@0: sl@0: TRAPD(r, DoPerformPrerequisiteL()); sl@0: if ((r != iExpectedWeakResult) && (TCrypto::Strength() == TCrypto::EWeak)) sl@0: { sl@0: r = KErrUnknown; sl@0: } sl@0: User::RequestComplete(status, r); sl@0: if (KErrNone==r) sl@0: { sl@0: iActionState = CTestAction::EAction; sl@0: } sl@0: else if (r==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: iActionState = CTestAction::EPostrequisite; sl@0: } sl@0: else if (r==KErrWeakKey) sl@0: { sl@0: iResult = ETrue; sl@0: iConsole.Printf(_L("Crypto libraries returned KErrWeakKey! Passing test automatically.\n\r")); sl@0: iOut.writeString(_L("Crypto libraries returned KErrWeakKey! Passing test automatically.\r\n")); sl@0: iActionState = CTestAction::EPostrequisite; sl@0: } sl@0: else sl@0: { sl@0: iActionState = CTestAction::EPostrequisite; sl@0: } sl@0: } sl@0: sl@0: void CCryptoTestAction::DoPerformPostrequisite(TRequestStatus& aStatus) sl@0: { sl@0: TRequestStatus* status = &aStatus; sl@0: TRAPD(r, DoPerformPostrequisiteL()); sl@0: delete iKey; sl@0: delete iInput; sl@0: delete iOutput; sl@0: delete iIV; sl@0: delete iEResult; sl@0: delete iDResult; sl@0: sl@0: iFinished = ETrue; sl@0: User::RequestComplete(status, r); sl@0: } sl@0: sl@0: void CCryptoTestAction::DoReportAction(void) sl@0: {} sl@0: sl@0: void CCryptoTestAction::DoCheckResult(TInt) sl@0: { sl@0: if (iResult==EFalse) sl@0: iConsole.Printf(_L("X")); sl@0: else sl@0: iConsole.Printf(_L(".")); sl@0: } sl@0: sl@0: void CCryptoTestAction::PerformAction(TRequestStatus& aStatus) sl@0: { sl@0: TRequestStatus* status = &aStatus; sl@0: sl@0: TRAPD(res, DoPerformActionL()); sl@0: if (res==KErrNoMemory) sl@0: { sl@0: User::Leave(res); // For OOM testing sl@0: } sl@0: iActionState = CTestAction::EPostrequisite; sl@0: User::RequestComplete(status, res); sl@0: } sl@0: sl@0: sl@0: void CCryptoTestAction::DoInputParseL(TDesC8& aScriptBuffer) sl@0: { sl@0: TInt err = KErrNone; sl@0: TInt pos = 0; sl@0: sl@0: TPtrC8 keyTemp = Input::ParseElement(aScriptBuffer, KKeyStart, KKeyEnd, pos, err); sl@0: iKey = HBufC8::NewL(keyTemp.Length()); sl@0: *iKey = keyTemp; sl@0: Hex(*iKey); sl@0: sl@0: pos = 0; sl@0: TPtrC8 inputTemp = Input::ParseElement(aScriptBuffer, KInputStart, KInputEnd, pos, err); sl@0: iInput = HBufC8::NewL(inputTemp.Length()); sl@0: *iInput = inputTemp; sl@0: Hex(*iInput); sl@0: sl@0: pos = 0; sl@0: TPtrC8 ivTemp = Input::ParseElement(aScriptBuffer, KIVStart, KIVEnd, pos, err); sl@0: iIV = HBufC8::NewL(ivTemp.Length()); sl@0: *iIV = ivTemp; sl@0: Hex(*iIV); sl@0: sl@0: pos = 0; sl@0: TPtrC8 outputTemp = Input::ParseElement(aScriptBuffer, KOutputStart, KOutputEnd, pos, err); sl@0: iOutput = HBufC8::NewL(outputTemp.Length()); sl@0: *iOutput = outputTemp; sl@0: Hex(*iOutput); sl@0: sl@0: pos = 0; sl@0: TPtrC8 cipherType = Input::ParseElement(aScriptBuffer, KCipherTypeStart, KCipherTypeEnd, pos, err); sl@0: iExpectedWeakResult = KErrNone; sl@0: if( cipherType == _L8("DESECB") ) sl@0: { sl@0: iCipherType = EDESECB; sl@0: } sl@0: else if( cipherType == _L8("DESCBC") ) sl@0: { sl@0: iCipherType = EDESCBC; sl@0: } sl@0: else if( cipherType == _L8("3DESECB") ) sl@0: { sl@0: iCipherType = E3DESECB; sl@0: iExpectedWeakResult = KErrKeyNotWeakEnough; sl@0: } sl@0: else if( cipherType == _L8("3DESCBC") ) sl@0: { sl@0: iCipherType = E3DESCBC; sl@0: iExpectedWeakResult = KErrKeyNotWeakEnough; sl@0: } sl@0: else if( cipherType == _L8("AESECB") ) sl@0: { sl@0: iCipherType = EAESECB; sl@0: iExpectedWeakResult = KErrKeyNotWeakEnough; sl@0: } sl@0: else if (cipherType==_L8("AESENC_ECB") ) sl@0: { sl@0: iCipherType = EAESMonteCarloEncryptECB; sl@0: iExpectedWeakResult = KErrKeyNotWeakEnough; sl@0: } sl@0: else if (cipherType==_L8("AESDEC_ECB") ) sl@0: { sl@0: iCipherType = EAESMonteCarloDecryptECB; sl@0: iExpectedWeakResult = KErrKeyNotWeakEnough; sl@0: } sl@0: else if (cipherType==_L8("AESENC_CBC") ) sl@0: { sl@0: iCipherType = EAESMonteCarloEncryptCBC; sl@0: iExpectedWeakResult = KErrKeyNotWeakEnough; sl@0: } sl@0: else if (cipherType==_L8("AESDEC_CBC") ) sl@0: { sl@0: iCipherType = EAESMonteCarloDecryptCBC; sl@0: iExpectedWeakResult = KErrKeyNotWeakEnough; sl@0: } sl@0: else if( cipherType == _L8("RC2ECB") ) sl@0: { sl@0: iCipherType = ERC2ECB; sl@0: // weak enough if either aKey or aEffectiveKeyLen is weak sl@0: TInt minKeySize = Min(iEffectiveKeyLen, BytesToBits(iKey->Size())); sl@0: TRAP(iExpectedWeakResult, TCrypto::IsSymmetricWeakEnoughL(minKeySize)); sl@0: } sl@0: else if( cipherType == _L8("RC2CBC") ) sl@0: { sl@0: iCipherType = ERC2CBC; sl@0: // weak enough if either aKey or aEffectiveKeyLen is weak sl@0: TInt minKeySize = Min(iEffectiveKeyLen, BytesToBits(iKey->Size())); sl@0: TRAP(iExpectedWeakResult, TCrypto::IsSymmetricWeakEnoughL(minKeySize)); sl@0: } sl@0: else if( cipherType == _L8("RC4") ) sl@0: { sl@0: iCipherType = ERC4; sl@0: TRAP(iExpectedWeakResult, TCrypto::IsSymmetricWeakEnoughL(BytesToBits(iKey->Size()))); sl@0: } sl@0: else if( cipherType == _L8("NULL") ) sl@0: { sl@0: iCipherType = ECipherNull; sl@0: } sl@0: else if( cipherType == _L8("DESECB_WKT")) sl@0: { sl@0: iCipherType = EDESECB; sl@0: iExpectedWeakResult = KErrWeakKey; sl@0: } sl@0: else if( cipherType == _L8("DESCBC_WKT")) sl@0: { sl@0: iCipherType = EDESCBC; sl@0: iExpectedWeakResult = KErrWeakKey; sl@0: } sl@0: else sl@0: { sl@0: TBuf<64> cipherName(0); sl@0: cipherName.Copy(cipherType); sl@0: TBuf<256> formattable; sl@0: formattable.Format(_L("\nBad Cipher Type: %S"), &cipherName); sl@0: iConsole.Printf(formattable); sl@0: sl@0: iActionState = CTestAction::EPostrequisite; sl@0: User::Leave(KErrNotSupported); sl@0: } sl@0: sl@0: if ( (iCipherType==ERC2ECB) || (iCipherType==ERC2CBC) ) sl@0: { sl@0: pos = 0; sl@0: TPtrC8 effKeyLenTemp = Input::ParseElement(aScriptBuffer, KEffKeyLenStart, KEffKeyLenEnd, pos, err); sl@0: sl@0: if (effKeyLenTemp.Length() != 0) sl@0: { sl@0: TLex8 lex; sl@0: lex.Assign(effKeyLenTemp); sl@0: User::LeaveIfError(lex.Val(iEffectiveKeyLen)); sl@0: } sl@0: } sl@0: sl@0: pos = 0; sl@0: TPtrC8 iterationsTemp = Input::ParseElement(aScriptBuffer, KIterationsStart, KIterationsEnd, pos, err); sl@0: TLex8 lex; sl@0: lex.Assign(iterationsTemp); sl@0: err = lex.Val(iIterationTime); sl@0: sl@0: pos = 0; sl@0: TPtrC8 randTemp = Input::ParseElement(aScriptBuffer, KRandDataSizeStart, KRandDataSizeEnd, pos, err); sl@0: TLex8 randlex; sl@0: randlex.Assign(randTemp); sl@0: err = randlex.Val(iRandDataSize); sl@0: sl@0: delete iBody; sl@0: iBody = NULL; sl@0: } sl@0: sl@0: void CCryptoTestAction::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: