diff -r da2ae96f639b -r cd501b96611d crypto/weakcryptospi/source/symmetric/cbcmodeshim.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/crypto/weakcryptospi/source/symmetric/cbcmodeshim.cpp Fri Nov 06 13:21:00 2009 +0200 @@ -0,0 +1,214 @@ +/* +* Copyright (c) 2006-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 "cbcmodeshim.h" + +#include +#include +#include +#include "cryptosymmetriccipherapi.h" +#include +#include "../common/inlines.h" + +// CModeCBCEncryptorShim +CModeCBCEncryptorShim::CModeCBCEncryptorShim(CryptoSpi::CSymmetricCipher* aSymmetricCipherImpl) : + iSymmetricCipherImpl(aSymmetricCipherImpl) + { + } + +CModeCBCEncryptorShim* CModeCBCEncryptorShim::NewL(CBlockTransformation* aBT, const TDesC8& aIv) + { + CModeCBCEncryptorShim* self(0); + + // Check whether the block transform contains an SPI plug-in + TAny* implPtr(0); + TInt err = aBT->GetExtension(CryptoSpi::KSymmetricCipherInterface, implPtr, NULL); + if (err == KErrNone && implPtr) + { + CryptoSpi::CSymmetricCipher* impl(static_cast(implPtr)); + + const CryptoSpi::TCharacteristics* c(0); + impl->GetCharacteristicsL(c); + + const CryptoSpi::TSymmetricCipherCharacteristics* cipherCharacteristics( + static_cast(c)); + + // Verify that the plug-in supports CBC mode + if (err == KErrNone && + cipherCharacteristics->IsOperationModeSupported(CryptoSpi::KOperationModeCBCUid)) + { + // Set block transform to encrypt-cbc + impl->SetCryptoModeL(CryptoSpi::KCryptoModeEncryptUid); + impl->SetOperationModeL(CryptoSpi::KOperationModeCBCUid); + impl->SetIvL(aIv); + self = new(ELeave) CModeCBCEncryptorShim(impl); + CleanupStack::PushL(self); + self->ConstructL(aBT, aIv); + CleanupStack::Pop(self); + } + } + return self; + } + +void CModeCBCEncryptorShim::ConstructL(CBlockTransformation* aBT, const TDesC8& aIv) + { + CModeCBCEncryptor::ConstructL(aBT, aIv); + } + +void CModeCBCEncryptorShim::Reset() + { + iSymmetricCipherImpl->Reset(); + } + +TInt CModeCBCEncryptorShim::BlockSize() const + { + return BitsToBytes(iSymmetricCipherImpl->BlockSize()); + } + +TInt CModeCBCEncryptorShim::KeySize() const + { + return iSymmetricCipherImpl->KeySize(); + } + +void CModeCBCEncryptorShim::Transform(TDes8& aBlock) + { + // This function will never get called if a buffered + // encryptor is used because Process and ProcessFinalL call + // iSymmetricCipherImpl directly + iBT->Transform(aBlock); + } + +void CModeCBCEncryptorShim::SetIV(const TDesC8& aIv) + { + TRAPD(err, iSymmetricCipherImpl->SetIvL(aIv)); + if (err == KErrOverflow) + { + User::Panic(KCryptoPanic, ECryptoPanicInputTooLarge); + } + else if (err != KErrNone) + { + // SetIvL should only leave if the aIv is incorrect + User::Panic(KCryptoPanic, KErrArgument); + } + } + +TInt CModeCBCEncryptorShim::Extension_(TUint aExtensionId, TAny*& a0, TAny* /*a1*/) + { + TInt ret(KErrExtensionNotSupported); + + if (CryptoSpi::KSymmetricCipherInterface == aExtensionId) + { + a0=iSymmetricCipherImpl; + ret=KErrNone; + } + return ret; + } + +// CModeCBCDecryptorShim +CModeCBCDecryptorShim::CModeCBCDecryptorShim(CryptoSpi::CSymmetricCipher* aSymmetricCipherImpl) : + iSymmetricCipherImpl(aSymmetricCipherImpl) + { + } + +CModeCBCDecryptorShim* CModeCBCDecryptorShim::NewL(CBlockTransformation* aBT, const TDesC8& aIv) + { + CModeCBCDecryptorShim* self(0); + + // Check whether the block transform contains an SPI plug-in + TAny* implPtr(0); + TInt err = aBT->GetExtension(CryptoSpi::KSymmetricCipherInterface, implPtr, NULL); + if (err == KErrNone && implPtr) + { + CryptoSpi::CSymmetricCipher* impl(static_cast(implPtr)); + + const CryptoSpi::TCharacteristics* c(0); + impl->GetCharacteristicsL(c); + + const CryptoSpi::TSymmetricCipherCharacteristics* cipherCharacteristics( + static_cast(c)); + + // Verify that the plug-in supports CBC mode + if (err == KErrNone && + cipherCharacteristics->IsOperationModeSupported(CryptoSpi::KOperationModeCBCUid)) + { + // Set block transform to encrypt-cbc + impl->SetCryptoModeL(CryptoSpi::KCryptoModeDecryptUid); + impl->SetOperationModeL(CryptoSpi::KOperationModeCBCUid); + impl->SetIvL(aIv); + self = new(ELeave) CModeCBCDecryptorShim(impl); + CleanupStack::PushL(self); + self->ConstructL(aBT, aIv); + CleanupStack::Pop(self); + } + } + return self; + } + +void CModeCBCDecryptorShim::ConstructL(CBlockTransformation* aBT, const TDesC8& aIv) + { + CModeCBCDecryptor::ConstructL(aBT, aIv); + } + +void CModeCBCDecryptorShim::Reset() + { + iSymmetricCipherImpl->Reset(); + } + +TInt CModeCBCDecryptorShim::BlockSize() const + { + return BitsToBytes(iSymmetricCipherImpl->BlockSize()); + } + +TInt CModeCBCDecryptorShim::KeySize() const + { + return iSymmetricCipherImpl->KeySize(); + } + +void CModeCBCDecryptorShim::Transform(TDes8& aBlock) + { + // This function will never get called if a buffered + // encryptor is used because Process and ProcessFinalL call + // iSymmetricCipherImpl directly + iBT->Transform(aBlock); + } + +void CModeCBCDecryptorShim::SetIV(const TDesC8& aIv) + { + TRAPD(err, iSymmetricCipherImpl->SetIvL(aIv)); + if (err == KErrOverflow) + { + User::Panic(KCryptoPanic, ECryptoPanicInputTooLarge); + } + else if (err != KErrNone) + { + // SetIvL should only leave if the aIv is incorrect + User::Panic(KCryptoPanic, KErrArgument); + } + } + +TInt CModeCBCDecryptorShim::Extension_(TUint aExtensionId, TAny*& a0, TAny* /*a1*/) + { + TInt ret(KErrExtensionNotSupported); + + if (CryptoSpi::KSymmetricCipherInterface == aExtensionId) + { + a0=iSymmetricCipherImpl; + ret=KErrNone; + } + return ret; + }