diff -r da2ae96f639b -r cd501b96611d crypto/weakcryptospi/source/pbe/pbencryptorset.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/crypto/weakcryptospi/source/pbe/pbencryptorset.cpp Fri Nov 06 13:21:00 2009 +0200 @@ -0,0 +1,217 @@ +/* +* 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 +#include + +#include +#include "pbesymmetricfactory.h" + +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +/** The maximum block size supported (in bytes) */ +const TUint KMaxBlockSizeSupported = 32; +#endif + +EXPORT_C CPBEncryptorSet* CPBEncryptorSet::NewL( + const TPBECipher aCipher, const TDesC8& aKey) + { + CPBEncryptorSet* self = NewLC(aCipher, aKey); + CleanupStack::Pop(); + return self; + } + +EXPORT_C CPBEncryptorSet* CPBEncryptorSet::NewLC( + const TPBECipher aCipher, const TDesC8& aKey) + { + CPBEncryptorSet* self = new(ELeave) CPBEncryptorSet; + CleanupStack::PushL(self); + + self->ConstructL(aCipher, aKey); + + return self; + } + +void CPBEncryptorSet::ConstructL(const TPBECipher aCipher,const TDesC8& aKey) + { + TInt blocksize = PBE::GetBlockBytes(aCipher); + iIV = HBufC8::NewMaxL(blocksize); + TPtr8 iv = iIV->Des(); + TRandom::RandomL(iv); + + iCipher = PBE::MakeEncryptorL(aCipher, aKey, iv); + } + +void CPBEncryptorSet::Process(const TDesC8& aInput, TDes8& aOutput) + { + if(!iIVSent) + { + aOutput.Append(*iIV); + iIVSent = ETrue; + } + iCipher->Process(aInput, aOutput); + } + +void CPBEncryptorSet::ProcessFinalL(const TDesC8& aInput, + TDes8& aOutput) + { + if(!iIVSent) + { + aOutput.Append(*iIV); + iIVSent = ETrue; + } + + iCipher->ProcessFinalL(aInput, aOutput); + } + + +CPBEncryptorSet::CPBEncryptorSet() : iIVSent(EFalse) + { + } + +CPBEncryptorSet::~CPBEncryptorSet() + { + delete iIV; + delete iCipher; // Don't delete iCBCDecryptor, this belongs to iCipher + } + +TInt CPBEncryptorSet::MaxOutputLength(TUint aMaxInputLength) const + { + if(iIVSent) + { + return (iCipher->MaxOutputLength(aMaxInputLength)); + } + else + {// If we've not sent the iv yet then its the length + // from the cipher plus a blocksize for the iv + return (iCipher->MaxOutputLength(aMaxInputLength + iCipher->BlockSize())); + } + } + +TInt CPBEncryptorSet::MaxFinalOutputLength(TUint aMaxInputLength) const + { + if(iIVSent) + { + return (iCipher->MaxFinalOutputLength(aMaxInputLength)); + } + else + {// If we've not sent the iv yet then its the length + // from the cipher plus a blocksize for the iv + return (iCipher->MaxFinalOutputLength(aMaxInputLength + iCipher->BlockSize())); + } + } + +EXPORT_C CPBDecryptorSet* CPBDecryptorSet::NewL(const TPBECipher aCipher, + const TDesC8& aKey) + { + CPBDecryptorSet* self = NewLC(aCipher, aKey); + CleanupStack::Pop(); + return self; + } + +EXPORT_C CPBDecryptorSet* CPBDecryptorSet::NewLC(const TPBECipher aCipher, + const TDesC8& aKey) + { + CPBDecryptorSet* self = new(ELeave) CPBDecryptorSet; + CleanupStack::PushL(self); + TBuf8 fakeIV; + fakeIV.SetLength(PBE::GetBlockBytes(aCipher)); + self->ConstructL(aCipher, aKey, fakeIV); + return self; + } + +void CPBDecryptorSet::ConstructL(const TPBECipher aCipher, + const TDesC8& aKey, const TDesC8& aIV) + { + iCipher = PBE::MakeDecryptorL(aCipher, aKey, aIV); + iIVBuf = HBufC8::NewL(PBE::GetBlockBytes(aCipher)); + } + +void CPBDecryptorSet::Process(const TDesC8& aInput, TDes8& aOutput) + { + TPtrC8 input = ProcessIV(aInput); + iCipher->Process(input, aOutput); + } + +void CPBDecryptorSet::ProcessFinalL(const TDesC8& aInput, TDes8& aOutput) + { + TPtrC8 input = ProcessIV(aInput); + iCipher->ProcessFinalL(input, aOutput); + } + +TPtrC8 CPBDecryptorSet::ProcessIV(const TDesC8& aInput) + { + if(!iIVSent) + { + TPtr8 iIVBufPtr(iIVBuf->Des()); + if(aInput.Length() + iIVBufPtr.Length() < iCipher->BlockSize()) + { + iIVBufPtr.Append(aInput); + return TPtrC8(); + } + else + { + TInt rem = iCipher->BlockSize() - iIVBufPtr.Length(); + iIVBufPtr.Append(aInput.Mid(0, rem)); + CBufferedDecryptor* blockDecryptor = static_cast(iCipher); + static_cast(blockDecryptor->BlockTransformer())->SetIV(iIVBufPtr); + iIVSent = ETrue; + return aInput.Mid(rem); + } + } + else + { + return aInput; + } + } + +CPBDecryptorSet::CPBDecryptorSet() : iIVSent(EFalse) + { + } + +CPBDecryptorSet::~CPBDecryptorSet() + { + delete iCipher; + //iCipher owns iCBCDecryptor we _don't_ need to delete it + delete iIVBuf; + } + +TInt CPBDecryptorSet::MaxOutputLength(TUint aMaxInputLength) const + { + if(iIVSent) + { + return (iCipher->MaxOutputLength(aMaxInputLength)); + } + else // if we haven't sent the iv yet, then the length the max length of the + { // cipher minus a BlockSize where the IV was sitting (as the iv would be part + // of the length they've sent us) + return (iCipher->MaxOutputLength(aMaxInputLength - iCipher->BlockSize())); + } + } + +TInt CPBDecryptorSet::MaxFinalOutputLength(TUint aMaxInputLength) const + { + if(iIVSent) + { + return (iCipher->MaxFinalOutputLength(aMaxInputLength)); + } + else // if we haven't sent the iv yet, then the length the max length of the + { // cipher minus a BlockSize where the IV was sitting (as the iv would be part + // of the length they've sent us) + return (iCipher->MaxFinalOutputLength(aMaxInputLength - iCipher->BlockSize())); + } + }