First public contribution.
2 * Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
4 * This component and the accompanying materials are made available
5 * under the terms of the License "Eclipse Public License v1.0"
6 * which accompanies this distribution, and is available
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
9 * Initial Contributors:
10 * Nokia Corporation - initial contribution.
19 #include "cbcmodeshim.h"
21 #include <cryptopanic.h>
22 #include <cryptospi/cryptospidef.h>
24 #include <cryptospi/cryptosymmetriccipherapi.h>
25 #include <cryptospi/plugincharacteristics.h>
26 #include "../common/inlines.h"
28 // CModeCBCEncryptorShim
29 CModeCBCEncryptorShim::CModeCBCEncryptorShim(CryptoSpi::CSymmetricCipher* aSymmetricCipherImpl) :
30 iSymmetricCipherImpl(aSymmetricCipherImpl)
34 CModeCBCEncryptorShim* CModeCBCEncryptorShim::NewL(CBlockTransformation* aBT, const TDesC8& aIv)
36 CModeCBCEncryptorShim* self(0);
38 // Check whether the block transform contains an SPI plug-in
40 TInt err = aBT->GetExtension(CryptoSpi::KSymmetricCipherInterface, implPtr, NULL);
41 if (err == KErrNone && implPtr)
43 CryptoSpi::CSymmetricCipher* impl(static_cast<CryptoSpi::CSymmetricCipher*>(implPtr));
45 const CryptoSpi::TCharacteristics* c(0);
46 impl->GetCharacteristicsL(c);
48 const CryptoSpi::TSymmetricCipherCharacteristics* cipherCharacteristics(
49 static_cast<const CryptoSpi::TSymmetricCipherCharacteristics*>(c));
51 // Verify that the plug-in supports CBC mode
52 if (err == KErrNone &&
53 cipherCharacteristics->IsOperationModeSupported(CryptoSpi::KOperationModeCBCUid))
55 // Set block transform to encrypt-cbc
56 impl->SetCryptoModeL(CryptoSpi::KCryptoModeEncryptUid);
57 impl->SetOperationModeL(CryptoSpi::KOperationModeCBCUid);
59 self = new(ELeave) CModeCBCEncryptorShim(impl);
60 CleanupStack::PushL(self);
61 self->ConstructL(aBT, aIv);
62 CleanupStack::Pop(self);
68 void CModeCBCEncryptorShim::ConstructL(CBlockTransformation* aBT, const TDesC8& aIv)
70 CModeCBCEncryptor::ConstructL(aBT, aIv);
73 void CModeCBCEncryptorShim::Reset()
75 iSymmetricCipherImpl->Reset();
78 TInt CModeCBCEncryptorShim::BlockSize() const
80 return BitsToBytes(iSymmetricCipherImpl->BlockSize());
83 TInt CModeCBCEncryptorShim::KeySize() const
85 return iSymmetricCipherImpl->KeySize();
88 void CModeCBCEncryptorShim::Transform(TDes8& aBlock)
90 // This function will never get called if a buffered
91 // encryptor is used because Process and ProcessFinalL call
92 // iSymmetricCipherImpl directly
93 iBT->Transform(aBlock);
96 void CModeCBCEncryptorShim::SetIV(const TDesC8& aIv)
98 TRAPD(err, iSymmetricCipherImpl->SetIvL(aIv));
99 if (err == KErrOverflow)
101 User::Panic(KCryptoPanic, ECryptoPanicInputTooLarge);
103 else if (err != KErrNone)
105 // SetIvL should only leave if the aIv is incorrect
106 User::Panic(KCryptoPanic, KErrArgument);
110 TInt CModeCBCEncryptorShim::Extension_(TUint aExtensionId, TAny*& a0, TAny* /*a1*/)
112 TInt ret(KErrExtensionNotSupported);
114 if (CryptoSpi::KSymmetricCipherInterface == aExtensionId)
116 a0=iSymmetricCipherImpl;
122 // CModeCBCDecryptorShim
123 CModeCBCDecryptorShim::CModeCBCDecryptorShim(CryptoSpi::CSymmetricCipher* aSymmetricCipherImpl) :
124 iSymmetricCipherImpl(aSymmetricCipherImpl)
128 CModeCBCDecryptorShim* CModeCBCDecryptorShim::NewL(CBlockTransformation* aBT, const TDesC8& aIv)
130 CModeCBCDecryptorShim* self(0);
132 // Check whether the block transform contains an SPI plug-in
134 TInt err = aBT->GetExtension(CryptoSpi::KSymmetricCipherInterface, implPtr, NULL);
135 if (err == KErrNone && implPtr)
137 CryptoSpi::CSymmetricCipher* impl(static_cast<CryptoSpi::CSymmetricCipher*>(implPtr));
139 const CryptoSpi::TCharacteristics* c(0);
140 impl->GetCharacteristicsL(c);
142 const CryptoSpi::TSymmetricCipherCharacteristics* cipherCharacteristics(
143 static_cast<const CryptoSpi::TSymmetricCipherCharacteristics*>(c));
145 // Verify that the plug-in supports CBC mode
146 if (err == KErrNone &&
147 cipherCharacteristics->IsOperationModeSupported(CryptoSpi::KOperationModeCBCUid))
149 // Set block transform to encrypt-cbc
150 impl->SetCryptoModeL(CryptoSpi::KCryptoModeDecryptUid);
151 impl->SetOperationModeL(CryptoSpi::KOperationModeCBCUid);
153 self = new(ELeave) CModeCBCDecryptorShim(impl);
154 CleanupStack::PushL(self);
155 self->ConstructL(aBT, aIv);
156 CleanupStack::Pop(self);
162 void CModeCBCDecryptorShim::ConstructL(CBlockTransformation* aBT, const TDesC8& aIv)
164 CModeCBCDecryptor::ConstructL(aBT, aIv);
167 void CModeCBCDecryptorShim::Reset()
169 iSymmetricCipherImpl->Reset();
172 TInt CModeCBCDecryptorShim::BlockSize() const
174 return BitsToBytes(iSymmetricCipherImpl->BlockSize());
177 TInt CModeCBCDecryptorShim::KeySize() const
179 return iSymmetricCipherImpl->KeySize();
182 void CModeCBCDecryptorShim::Transform(TDes8& aBlock)
184 // This function will never get called if a buffered
185 // encryptor is used because Process and ProcessFinalL call
186 // iSymmetricCipherImpl directly
187 iBT->Transform(aBlock);
190 void CModeCBCDecryptorShim::SetIV(const TDesC8& aIv)
192 TRAPD(err, iSymmetricCipherImpl->SetIvL(aIv));
193 if (err == KErrOverflow)
195 User::Panic(KCryptoPanic, ECryptoPanicInputTooLarge);
197 else if (err != KErrNone)
199 // SetIvL should only leave if the aIv is incorrect
200 User::Panic(KCryptoPanic, KErrArgument);
204 TInt CModeCBCDecryptorShim::Extension_(TUint aExtensionId, TAny*& a0, TAny* /*a1*/)
206 TInt ret(KErrExtensionNotSupported);
208 if (CryptoSpi::KSymmetricCipherInterface == aExtensionId)
210 a0=iSymmetricCipherImpl;