--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/crypto/weakcryptospi/test/tcryptospi/src/symmetriccipherstepbase.cpp Thu Sep 10 14:01:51 2009 +0300
@@ -0,0 +1,241 @@
+/*
+* Copyright (c) 2007-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:
+*
+*/
+
+
+/**
+ @file
+ @internalTechnology
+*/
+
+#include "symmetriccipherstepbase.h"
+#include <bigint.h>
+
+
+/**
+Common setup of a crypto SPI symmetric cipher.
+@param aArc4Check Determines whether the check is run on the cipher type for ARC4 and if it matches, sets up the CCryptoParams accordingly.
+@param aRc2Check Determines whether the check is run on the cipher type for RC2 and if it matches, sets up the CCryptoParams accordingly.
+@param aOperationMode On return is the operation mode read in from the config file and used in the initial setup of the cipher.
+@param aCipher On return the symmetric cipher implementation.
+@param aKey On return aCipher's key object. This is should not be deleted until after aCipher is deleted.
+@return The error value from the call to the symmetric cipher creation function.
+*/
+void CSymmetricCipherStepBase::SetupCipherL(TBool aArc4Check, TBool aRc2Check, TVariantPtrC& aOperationMode, CSymmetricCipher*& aCipher, CKey*& aKey)
+ {
+ TPtrC keyPath;
+ TVariantPtrC algorithm;
+ TVariantPtrC paddingMode;
+
+ if( !GetStringFromConfig(ConfigSection(),KConfigEncryptKey, keyPath) ||
+ !GetStringFromConfig(ConfigSection(),KConfigAlgorithmUid, algorithm) ||
+ !GetStringFromConfig(ConfigSection(),KConfigOperationMode, aOperationMode) ||
+ !GetStringFromConfig(ConfigSection(),KConfigPaddingMode, paddingMode ))
+ {
+ User::Leave(KErrNotFound);
+ }
+
+ // Create key
+ TKeyProperty keyProperty;
+ CCryptoParams* params = CCryptoParams::NewLC();
+
+ CFileReader* keyData = CFileReader::NewLC(keyPath);
+ params->AddL( *keyData, KSymmetricKeyParameterUid);
+
+ aKey=CKey::NewL(keyProperty, *params);
+ CleanupStack::PushL(aKey);
+
+ CCryptoParams* xparams = NULL;
+ if ((aArc4Check) && (TUid(algorithm) == KArc4Uid))
+ {
+ // Set the RC4 DiscardBytes to 0
+ xparams = CCryptoParams::NewLC();
+ xparams->AddL(NULL, KARC4DiscardBytes);
+
+ // Create a Symmetric Cipher with the values from the ini file
+ CSymmetricCipherFactory::CreateSymmetricCipherL(aCipher, algorithm, *aKey, KCryptoModeEncryptUid, aOperationMode, paddingMode, xparams);
+ CleanupStack::PopAndDestroy(xparams);
+ CleanupStack::Pop(aKey);
+ CleanupStack::PopAndDestroy(2, params);
+ }
+ else if ((aRc2Check) && (TUid(algorithm) == KRc2Uid))
+ {
+ TInt keylen = TPtrC8(*keyData).Length() * 8;
+ xparams = CCryptoParams::NewLC();
+
+ // Set the RC2 EffectiveKeyLen according to the input key size
+ xparams->AddL( keylen, KRC2EffectiveKeyLenBits);
+
+ // Create a Symmetric Cipher with the values from the ini file
+ CSymmetricCipherFactory::CreateSymmetricCipherL(aCipher, algorithm, *aKey, KCryptoModeEncryptUid, aOperationMode, paddingMode, xparams);
+ CleanupStack::PopAndDestroy(xparams);
+ CleanupStack::Pop(aKey);
+ CleanupStack::PopAndDestroy(2, params);
+ }
+ else
+ {
+ // Create a Symmetric Cipher with the values from the ini file
+ CSymmetricCipherFactory::CreateSymmetricCipherL(aCipher, algorithm, *aKey, KCryptoModeEncryptUid, aOperationMode, paddingMode, xparams);
+ CleanupStack::Pop(aKey);
+ CleanupStack::PopAndDestroy(2, params);
+ }
+ }
+
+
+/**
+When running in CTR mode call this function to calculate the block size of a cipher.
+@param aCipher The cipher whose block size is returned.
+@return The block size in bits.
+*/
+TInt CSymmetricCipherStepBase::CtrModeCalcBlockSizeL(CSymmetricCipher& aCipher)
+ {
+ // aCipher MUST be running in CTR mode
+ aCipher.SetOperationModeL(KOperationModeCBCUid);
+ TInt blockSize = aCipher.BlockSize();
+ aCipher.SetOperationModeL(KOperationModeCTRUid);
+ return blockSize;
+ }
+
+
+/**
+Read in the plaintext from the course file listed in the configuration file.
+@param aPlaintext Descriptor pointing to the plaintext.
+@param aReader This CFileReader pointer must be NULL when passed in. It must not be deleted until after the client has finished with the plaintext.
+*/
+HBufC8* CSymmetricCipherStepBase::ReadInPlaintextL()
+ {
+ TPtrC plaintextPath;
+ if(!GetStringFromConfig(ConfigSection(),KConfigSourcePath, plaintextPath))
+ {
+ User::Leave(KErrNotFound);
+ }
+
+ return ReadFileL(plaintextPath);
+ }
+
+
+/**
+Read in the ciphertext from the course file listed in the configuration file.
+@param aCiphertext Descriptor pointing to the ciphertext.
+@param aReader This CFileReader pointer must be NULL when passed in. It must not be deleted until after the client has finished with the ciphertext.
+
+*/
+HBufC8* CSymmetricCipherStepBase::ReadInCiphertextL()
+ {
+ TPtrC ciphertextPath;
+ if(!GetStringFromConfig(ConfigSection(),KConfigEncryptedPath, ciphertextPath))
+ {
+ User::Leave(KErrNotFound);
+ }
+
+ return ReadFileL(ciphertextPath);
+ }
+
+
+/**
+Read in the IV from the course file listed in the configuration file.
+@param aIV Descriptor pointing to the IV.
+@param aReader This CFileReader pointer must be NULL when passed in. It must not be deleted until after the client has finished with the IV.
+
+*/
+HBufC8* CSymmetricCipherStepBase::ReadInIvL()
+ {
+ TPtrC ivPath;
+ if(!GetStringFromConfig(ConfigSection(),KConfigIVPath, ivPath))
+ {
+ User::Leave(KErrNotFound);
+ }
+
+ return ReadFileL(ivPath);
+ }
+
+
+/**
+@param aCounter
+*/
+HBufC8* CSymmetricCipherStepBase::CtrModeIncrementCounterL(TDesC8& aCounter)
+ {
+ RInteger bigInt = RInteger::NewL(aCounter);
+ CleanupClosePushL(bigInt);
+ ++bigInt;
+ HBufC8* result = bigInt.BufferLC();
+ CleanupStack::Pop(result);
+ CleanupStack::PopAndDestroy();
+ return result;
+ }
+
+HBufC8* CSymmetricCipherStepBase::ReadInHexCiphertextL()
+ {
+ HBufC8* hex = ReadInCiphertextL();
+ CleanupStack::PushL(hex);
+ HBufC8* result = ConvertFromHexFormatToRawL((*hex));
+ CleanupStack::PopAndDestroy(hex);
+ return result;
+ }
+
+HBufC8* CSymmetricCipherStepBase::ReadInHexPlaintextL()
+ {
+ HBufC8* hex = ReadInPlaintextL();
+ CleanupStack::PushL(hex);
+ HBufC8* result = ConvertFromHexFormatToRawL((*hex));
+ CleanupStack::PopAndDestroy(hex);
+ return result;
+ }
+
+HBufC8* CSymmetricCipherStepBase::ReadInHexPlainTextL(TPtrC aFile)
+ {
+ HBufC8* data = ReadFileL(aFile);
+ CleanupStack::PushL(data);
+ HBufC8* result = ConvertFromHexFormatToRawL(*data);
+ CleanupStack::PopAndDestroy(data);
+ return result;
+ }
+
+HBufC8* CSymmetricCipherStepBase::ReadFileL(TPtrC aFile)
+ {
+ CFileReader* reader = CFileReader::NewL(aFile);
+ CleanupStack::PushL(reader);
+ TPtrC8 ptr(*reader);
+ HBufC8* fileData = ptr.AllocL();
+ CleanupStack::PopAndDestroy(reader);
+ return fileData;
+ }
+
+HBufC8* CSymmetricCipherStepBase::ReadInHexIvL()
+ {
+ HBufC8* hex = ReadInIvL();
+ CleanupStack::PushL(hex);
+ HBufC8* result = ConvertFromHexFormatToRawL((*hex));
+ CleanupStack::PopAndDestroy(hex);
+ return result;
+ }
+
+HBufC8* CSymmetricCipherStepBase::ConvertFromHexFormatToRawL(TDesC8& aInput)
+ {
+ TBuf8<2> hexPair;
+ HBufC8* result = HBufC8::NewLC(aInput.Length()/2);
+ TUint8 val;
+
+ for(TInt i = 0 ; i < aInput.Length()-1 ; i+=2)
+ {
+ hexPair = aInput.Mid(i,2);
+ TLex8 lex(hexPair);
+ User::LeaveIfError(lex.Val(val, EHex));
+ result->Des().Append(val);
+ }
+ CleanupStack::Pop(result);
+ return result;
+ }