diff -r 641f389e9157 -r a71299154b21 crypto/weakcrypto/source/symmetric/bufferedtransformation.cpp --- a/crypto/weakcrypto/source/symmetric/bufferedtransformation.cpp Tue Aug 31 17:00:08 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,232 +0,0 @@ -/* -* Copyright (c) 2002-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 "bufferedtransformation.h" -#include "blocktransformation.h" -#include "padding.h" -#include "../common/inlines.h" -#include - -EXPORT_C CBufferedTransformation::~CBufferedTransformation() - { - delete iBT; - delete iPadding; - delete iInputStoreBuf; - } - -void CBufferedTransformation::Process(const TDesC8& aInput, TDes8& aOutput) - { - __ASSERT_DEBUG(aOutput.MaxLength() >= MaxOutputLength(aInput.Length()), User::Panic(KCryptoPanic, ECryptoPanicOutputDescriptorOverflow)); - - TInt blockSize = iBT->BlockSize(); - - if ( (aInput.Size() + iInputStore.Size()) < blockSize ) - { - iInputStore.Append(aInput); - } - else - { - TInt outputIndex = aOutput.Size(); - aOutput.Append(iInputStore); - - TInt inputIndex = blockSize - iInputStore.Size(); - aOutput.Append(aInput.Mid(0, inputIndex)); - - TPtr8 transformBuf((TUint8*)(aOutput.Ptr()) + outputIndex, blockSize, - blockSize); - //This should read: - //TPtr8 transformBuf(aOutput.Mid(outputIndex, blockSize)); - //but in the wonderful world of descriptors, Mid returns a TPtrC8 even - //when called on a TPtr8. Fantastic eh? - iBT->Transform(transformBuf); - - outputIndex += blockSize; - - TInt len = aInput.Size() - blockSize; - - for (; inputIndex<=len; inputIndex+=blockSize) - { - aOutput.Append(aInput.Mid(inputIndex, blockSize)); - transformBuf.Set((TUint8*)(aOutput.Ptr()) + outputIndex, blockSize, - blockSize); - iBT->Transform(transformBuf); - outputIndex += blockSize; - } - - iInputStore.Zero(); - if (inputIndex < aInput.Size()) - iInputStore.Append(aInput.Mid(inputIndex)); - } - } - -TInt CBufferedTransformation::MaxOutputLength(TInt aInputLength) const - { - TInt rem = (aInputLength + iInputStore.Size()) % (iBT->BlockSize()); - return ((aInputLength + iInputStore.Size()) - rem); - } - -void CBufferedTransformation::Reset() - { - iBT->Reset(); - iInputStore.Zero(); - } - -TInt CBufferedTransformation::BlockSize() const - { - return (iBT->BlockSize()); - } - -TInt CBufferedTransformation::KeySize() const - { - return (iBT->KeySize()); - } - -EXPORT_C CBlockTransformation* CBufferedTransformation::BlockTransformer() const -{ - return (iBT); -} - -CBufferedTransformation::CBufferedTransformation() - : iInputStore(0,0,0) - { - } - -void CBufferedTransformation::ConstructL(CBlockTransformation* aBT, CPadding* aPadding) - { - iInputStoreBuf = HBufC8::NewL(aBT->BlockSize()); - iInputStore.Set(iInputStoreBuf->Des()); - - // Take ownership last - doesn't take ownership if we leave - iBT = aBT; - iPadding = aPadding; - } - - -// CBufferedEncryptor - -EXPORT_C CBufferedEncryptor* CBufferedEncryptor::NewL( - CBlockTransformation* aBT, CPadding* aPadding) - { - CBufferedEncryptor* self = NewLC(aBT,aPadding); - CleanupStack::Pop(self); - return self; - } - -EXPORT_C CBufferedEncryptor* CBufferedEncryptor::NewLC( - CBlockTransformation* aBT, CPadding* aPadding) - { - CBufferedEncryptor* self = new (ELeave) CBufferedEncryptor(); - CleanupStack::PushL(self); - self->ConstructL(aBT, aPadding); - return self; - } - -CBufferedEncryptor::CBufferedEncryptor() - { - } - -void CBufferedEncryptor::ProcessFinalL(const TDesC8& aInput, TDes8& aOutput) - { - __ASSERT_DEBUG(aOutput.MaxLength() >= MaxFinalOutputLength(aInput.Length()), User::Panic(KCryptoPanic, ECryptoPanicOutputDescriptorOverflow)); - Process(aInput, aOutput); - - TInt outputIndex = aOutput.Size(); - iPadding->PadL(iInputStore, aOutput); - assert(aOutput.Size() % iBT->BlockSize() == 0); - - TUint blockSize = iBT->BlockSize(); - TInt len = aOutput.Size() - outputIndex; - - for(TInt i=len; i>0; i-=blockSize) - { - TPtr8 transformBuf((TUint8*)(aOutput.Ptr()) + outputIndex, blockSize, - blockSize); - iBT->Transform(transformBuf); - outputIndex+=blockSize; - } - - iInputStore.Zero(); - } - -TInt CBufferedEncryptor::MaxFinalOutputLength(TInt aInputLength) const - { - return iPadding->MaxPaddedLength(iInputStore.Size() + aInputLength); - } - -// CBufferedDecryptor - -EXPORT_C CBufferedDecryptor* CBufferedDecryptor::NewL( - CBlockTransformation* aBT, CPadding* aPadding) - { - CBufferedDecryptor* self = NewLC(aBT,aPadding); - CleanupStack::Pop(self); - return self; - } - -EXPORT_C CBufferedDecryptor* CBufferedDecryptor::NewLC( - CBlockTransformation* aBT, CPadding* aPadding) - { - CBufferedDecryptor* self = new (ELeave) CBufferedDecryptor(); - CleanupStack::PushL(self); - self->ConstructL(aBT, aPadding); - return self; - } - -CBufferedDecryptor::CBufferedDecryptor() - { - } - -void CBufferedDecryptor::ProcessFinalL(const TDesC8& aInput, TDes8& aOutput) - { - __ASSERT_DEBUG(aOutput.MaxLength() >= MaxFinalOutputLength(aInput.Length()), User::Panic(KCryptoPanic, ECryptoPanicOutputDescriptorOverflow)); - - assert((aInput.Size() + iInputStore.Size()) % iPadding->BlockSize()==0); - assert(aInput.Size() + iInputStore.Size() !=0 ); - assert(iPadding->BlockSize() % BlockSize() == 0); - //1) Decrypt into aOutput up till the last full _padding_ blocksize - //If this panics with descriptor problems, you've probably called - //ProcessFinalL with a non-_padding_ blocksized aligned amount of data. - TInt lenToDecrypt = aInput.Size() - iPadding->BlockSize(); - if(lenToDecrypt > 0) - { - Process(aInput.Left(lenToDecrypt), aOutput); - assert(iInputStore.Size()==0); - } - else - { - lenToDecrypt = 0; - } - - //2) Decrypt the last _padding_ blocksize into a new buffer - HBufC8* padBuf = HBufC8::NewLC(iPadding->BlockSize()); - TPtr8 padPtr = padBuf->Des(); - Process(aInput.Mid(lenToDecrypt), padPtr); - assert(iInputStore.Size()==0); - - //3) Unpad that last _padding_ blocksize into aOutput - // Note that padding systems must always, like everything else in crypto, - // _append_ data. - iPadding->UnPadL(padPtr, aOutput); - - CleanupStack::PopAndDestroy(padBuf); - } - -TInt CBufferedDecryptor::MaxFinalOutputLength(TInt aInputLength) const - { - return iPadding->MaxUnPaddedLength(aInputLength + iInputStore.Size()); - }