--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/crypto/weakcrypto/test/tsymmetric/tactionmontecarlo.cpp Wed Jul 08 11:25:26 2009 +0100
@@ -0,0 +1,261 @@
+/*
+* Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#include "tactionmontecarlo.h"
+#include "bufferedtransformation.h"
+#include "rijndael.h"
+#include "cbcmode.h"
+#include "padding.h"
+
+const TInt KAESBlockSizeBytes = 16; // 128 bits
+
+CTestAction* CActionMonteCarlo::NewL(RFs& aFs,
+ CConsoleBase& aConsole,
+ Output& aOut,
+ const TTestActionSpec& aTestActionSpec)
+ {
+ CTestAction* self = CActionMonteCarlo::NewLC(aFs, aConsole,
+ aOut, aTestActionSpec);
+ CleanupStack::Pop();
+ return self;
+ }
+
+CTestAction* CActionMonteCarlo::NewLC(RFs& aFs,
+ CConsoleBase& aConsole,
+ Output& aOut,
+ const TTestActionSpec& aTestActionSpec)
+ {
+ CActionMonteCarlo* self = new(ELeave) CActionMonteCarlo(aFs, aConsole, aOut);
+ CleanupStack::PushL(self);
+ self->ConstructL(aTestActionSpec);
+ return self;
+ }
+
+CActionMonteCarlo::~CActionMonteCarlo()
+{
+ delete iEncrypt;
+ delete iDecrypt;
+}
+
+CActionMonteCarlo::CActionMonteCarlo(RFs& aFs,
+ CConsoleBase& aConsole,
+ Output& aOut)
+
+: CCryptoTestAction(aFs, aConsole, aOut)
+{}
+
+
+void CActionMonteCarlo::DoPerformPrerequisiteL()
+{
+ TInt err = KErrNone;
+ TInt pos = 0;
+ TPtrC8 monteCarlo = Input::ParseElement(*iBody, KMonteCarloStart, KMonteCarloEnd, pos, err);
+
+ DoInputParseL(monteCarlo);
+
+ CBlockTransformation* encryptor = NULL;
+ CBlockTransformation* decryptor = NULL;
+
+ switch (iCipherType)
+ {
+ case (EAESMonteCarloEncryptECB):
+ {
+ encryptor = CAESEncryptor::NewLC(iKey->Des());
+ }
+ break;
+ case (EAESMonteCarloDecryptECB):
+ {
+ decryptor = CAESDecryptor::NewLC(iKey->Des());
+ }
+ break;
+ case (EAESMonteCarloEncryptCBC):
+ {
+ CBlockTransformation* aesEncryptor = NULL;
+ aesEncryptor = CAESEncryptor::NewLC(iKey->Des());
+
+ encryptor = CModeCBCEncryptor::NewL(aesEncryptor, iIV->Des());
+ CleanupStack::Pop(aesEncryptor);
+ CleanupStack::PushL(encryptor);
+ }
+ break;
+ case (EAESMonteCarloDecryptCBC):
+ {
+ CBlockTransformation* aesDecryptor = NULL;
+ aesDecryptor = CAESDecryptor::NewLC(iKey->Des());
+
+ decryptor = CModeCBCDecryptor::NewL(aesDecryptor, iIV->Des());
+ CleanupStack::Pop(aesDecryptor);
+ CleanupStack::PushL(decryptor);
+ }
+ break;
+ default:
+ {
+ ASSERT(0);
+ User::Leave(KErrNotSupported);
+ }
+ }
+
+
+ CPaddingSSLv3* padding = 0;
+ if (encryptor)
+ {
+ padding = CPaddingSSLv3::NewLC(encryptor->BlockSize());
+ iEncrypt = CBufferedEncryptor::NewL(encryptor, padding);
+ iEResult = HBufC8::NewMaxL(iEncrypt->MaxOutputLength(iInput->Length()));
+ }
+ else if (decryptor)
+ {
+ padding = CPaddingSSLv3::NewLC(decryptor->BlockSize());
+ iDecrypt = CBufferedDecryptor::NewL(decryptor, padding);
+ iDResult = HBufC8::NewMaxL(iDecrypt->MaxOutputLength(iInput->Size()));
+ }
+
+ CleanupStack::Pop(2); // padding, encryptor/decryptor
+
+}
+
+
+void CActionMonteCarlo::DoPerformActionL()
+{
+ iResult = EFalse;
+
+ __ASSERT_DEBUG(iInput->Size()==KAESBlockSizeBytes, User::Panic(_L("tsymmetric"), KErrNotSupported));
+
+ if (iCipherType==EAESMonteCarloEncryptECB)
+ DoAESEncryptECB();
+ else if (iCipherType==EAESMonteCarloDecryptECB)
+ DoAESDecryptECB();
+ else if (iCipherType==EAESMonteCarloEncryptCBC)
+ DoAESEncryptCBC();
+ else if (iCipherType==EAESMonteCarloDecryptCBC)
+ DoAESDecryptCBC();
+ else
+ User::Leave(KErrNotSupported);
+}
+
+void CActionMonteCarlo::DoAESEncryptECB()
+{
+ TPtr8 theEncryptResult(iEResult->Des());
+ theEncryptResult.FillZ(theEncryptResult.MaxLength());
+ theEncryptResult.SetLength(0);
+
+ TInt index = 0;
+ TPtr8 theInput(iInput->Des());
+ for (; index < KMonteCarloIterations; index++)
+ {
+ iEncrypt->Process(theInput, theEncryptResult);
+ theInput.Copy(theEncryptResult);
+ theEncryptResult.FillZ(theEncryptResult.MaxLength());
+ theEncryptResult.SetLength(0);
+ }
+
+ if (*iOutput==*iEResult)
+ {
+ iResult = ETrue;
+ }
+}
+
+void CActionMonteCarlo::DoAESDecryptECB()
+{
+ TPtr8 theDecryptResult(iDResult->Des());
+ theDecryptResult.FillZ(theDecryptResult.MaxLength());
+ theDecryptResult.SetLength(0);
+
+ TInt index = 0;
+ TPtr8 theInput(iInput->Des());
+ for (; index < KMonteCarloIterations; index++)
+ {
+ iDecrypt->Process(theInput, theDecryptResult);
+ theInput.Copy(theDecryptResult);
+ theDecryptResult.FillZ(theDecryptResult.MaxLength());
+ theDecryptResult.SetLength(0);
+ }
+
+ if (*iOutput==*iInput)
+ {
+ iResult = ETrue;
+ }
+}
+
+void CActionMonteCarlo::DoAESEncryptCBC()
+ {
+ TPtr8 theEncryptResult(iEResult->Des());
+ theEncryptResult.FillZ(theEncryptResult.MaxLength());
+ theEncryptResult.SetLength(0);
+
+ TInt index = 0;
+ TPtr8 theInput(iInput->Des());
+
+ TBuf8<KAESBlockSizeBytes> nextBuf;
+ nextBuf.FillZ(KAESBlockSizeBytes);
+
+ for (; index < KMonteCarloIterations-1; index++)
+ {
+ iEncrypt->Process(theInput, theEncryptResult);
+
+ if (index==0)
+ theInput.Copy(*iIV); // First loop, use the original IV as next PT block
+ else
+ theInput.Copy(nextBuf); // Use previous CT block as next PT block
+
+ // Save CT block for next loop when it'll become the PT block
+ nextBuf.Copy(theEncryptResult);
+ // Reset for next encryption
+ theEncryptResult.FillZ(theEncryptResult.MaxLength());
+ theEncryptResult.SetLength(0);
+ }
+
+ iEncrypt->Process(theInput, theEncryptResult);
+
+ if (theEncryptResult.Compare(*iOutput)==KErrNone)
+ {
+ iResult = ETrue;
+ }
+
+ }
+
+void CActionMonteCarlo::DoAESDecryptCBC()
+ {
+ TPtr8 theDecryptResult(iDResult->Des());
+ theDecryptResult.FillZ(theDecryptResult.MaxLength());
+ theDecryptResult.SetLength(0);
+
+ TInt index = 0;
+ TPtr8 theInput(iInput->Des());
+
+ for (; index < KMonteCarloIterations-1; index++)
+ {
+ iDecrypt->Process(theInput, theDecryptResult);
+
+ // Use previous PT block as next CT block
+ theInput.Copy(theDecryptResult);
+
+ // Reset for next decryption
+ theDecryptResult.FillZ(theDecryptResult.MaxLength());
+ theDecryptResult.SetLength(0);
+ }
+
+ // Last loop
+ iDecrypt->Process(theInput, theDecryptResult);
+
+ if (theDecryptResult.Compare(*iOutput)==KErrNone)
+ {
+ iResult = ETrue;
+ }
+
+ }