diff -r 000000000000 -r 2c201484c85f crypto/weakcrypto/inc/bufferedtransformation.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/crypto/weakcrypto/inc/bufferedtransformation.h Wed Jul 08 11:25:26 2009 +0100 @@ -0,0 +1,205 @@ +/* +* 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: +* ** IMPORTANT ** PublishedPartner API's in this file are published to 3rd party developers via the +* Symbian website. Changes to these API's should be treated as PublishedAll API changes and the Security TA should be consulted. +* +*/ + + + + +/** + @file + @internalAll +*/ + +#ifndef __BUFFEREDTRANSFORMATION_H__ +#define __BUFFEREDTRANSFORMATION_H__ + +#include +#include "msymmetriccipher.h" +#include "blocktransformation.h" + +class CPadding; + +/** + * Abstract class, deriving from CSymmetricCipher, encapsulating the buffering + * logic for block ciphers. + * + * It is responsible for feeding complete blocks of plaintext or ciphertext to + * the underlying encryptor or decryptor. Since the only difference between + * block cipher encryption and decryption is the ProcessFinalL() call, + * CBufferedTransformation implements all functions (by buffering and/or + * forwarding to the encryptor/decryptor) except ProcessFinalL() and + * MaxFinalOutputLength(). + * + * See the Cryptography api-guide documentation for the rules that this class + * and derived classes must follow. + * + * @publishedPartner + * @released + */ +class CBufferedTransformation : public CSymmetricCipher +{ +public: + /** The destructor frees all resources owned by the object, prior to its destruction. */ + IMPORT_C virtual ~CBufferedTransformation(); +public: + /** + * Encrypts or decrypts the input using the underlying block cipher, buffering + * the input as necessary. + * + * See the Cryptography api-guide documentation. + * + * @param aInput The input is appended to the internal buffer (initially empty), + * then all whole blocks are encrypted using the underlying block + * transformation and written into aOutput. Any leftover bytes will + * be buffered. + * @param aOutput The resulting processed data appended to aOutput. aOutput must + * have at least MaxOutputLength() empty bytes remaining in its length. + */ + virtual void Process(const TDesC8& aInput, TDes8& aOutput); + virtual TInt MaxOutputLength(TInt aInputLength) const; + virtual void Reset(); + virtual TInt BlockSize() const; + virtual TInt KeySize() const; +public: + /** + * Gets the underlying block transform. + * + * @return A pointer to the CBlockTransformation object + */ + IMPORT_C CBlockTransformation* BlockTransformer() const; +protected: + /** @internalAll */ + CBufferedTransformation(); + /** @internalAll */ + void ConstructL(CBlockTransformation* aBT, CPadding* aPadding); +protected: + /** A block transformation object */ + CBlockTransformation* iBT; + /** A descriptor which provides a buffer the length of the block size of iBT */ + HBufC8* iInputStoreBuf; + /** A pointer to iInputStoreBuf */ + TPtr8 iInputStore; + /** The padding */ + CPadding* iPadding; +}; + +/** + * Subclass of CBufferedTransformation for buffered encryption. + * + * Objects of this class are intialised with, and subsequently own, an encryptor + * derived from CBlockTransformation and a subclass of CPadding. + * + * @publishedPartner + * @released + */ +class CBufferedEncryptor : public CBufferedTransformation +{ +public: + /** + * Creates a CBufferedEncryptor object taking ownership of aBT and aPadding. + * + * @param aBT Block transformation object (encryptor) + * @param aPadding Padding object (deriving from CPadding) + * @return A pointer to the new CBufferedEncryptor object + */ + IMPORT_C static CBufferedEncryptor* NewL(CBlockTransformation* aBT, + CPadding* aPadding); + + /** + * Creates a CBufferedEncryptor object taking ownership of aBT and aPadding. + * + * The returned pointer is put onto the cleanup stack. + * + * @param aBT Block transformation object (encryptor) + * @param aPadding Padding object (deriving from CPadding) + * @return A pointer to the new CBufferedEncryptor object + */ + IMPORT_C static CBufferedEncryptor* NewLC(CBlockTransformation* aBT, + CPadding* aPadding); +public: + /** + * Completes an encryption operation using the underlying block transformation, but + * first ensuring that input data is block aligned using the previously supplied + * CPadding object. + * + * See the Cryptography api-guide documentation. + * + * @param aInput The final input data to be processed. + * @param aOutput The resulting processed data appended to aOutput. aOutput must + * have at least MaxFinalOutputLength() empty bytes remaining in its + * length. + */ + virtual void ProcessFinalL(const TDesC8& aInput, TDes8& aOutput); + virtual TInt MaxFinalOutputLength(TInt aInputLength) const; +protected: + /** @internalAll */ + CBufferedEncryptor(); +}; + +/** + * Subclass of CBufferedTransformation for buffered decryption. + * + * Objects of this class are intialised with, and subsequently own, a decryptor + * derived from CBlockTransformation and a subclass of CPadding. + * + * @publishedPartner + * @released + */ +class CBufferedDecryptor : public CBufferedTransformation +{ +public: + /** + * Creates a CBufferedDecryptor object taking ownership of aBT and aPadding. + * + * @param aBT Block transformation object (decryptor) + * @param aPadding Padding object (deriving from CPadding) + * @return A pointer to the CBufferedDecryptor object. + */ + IMPORT_C static CBufferedDecryptor* NewL(CBlockTransformation* aBT, + CPadding* aPadding); + + /** + * Creates a CBufferedDecryptor object taking ownership of aBT and aPadding. + * + * The returned pointer is put onto the cleanup stack. + * + * @param aBT Block transformation object (decryptor) + * @param aPadding Padding object (deriving from CPadding) + * @return A pointer to the new CBufferedDecryptor object + */ + IMPORT_C static CBufferedDecryptor* NewLC(CBlockTransformation* aBT, + CPadding* aPadding); +public: + /** + * Completes a decryption operation using the underlying block transformation and + * unpads the decrypted data. + * + * @param aInput The data to be processed and unpadded. + * aInput must be a whole number of blocks. + * @param aOutput The resulting processed and unpadded data appened to aOutput. + * aOutput must have at least MaxFinalOutputLength() empty bytes + * remaining in its length. + */ + virtual void ProcessFinalL(const TDesC8& aInput, TDes8& aOutput); + virtual TInt MaxFinalOutputLength(TInt aInputLength) const; +protected: + /** @internalAll */ + CBufferedDecryptor(); +}; + +#endif // __CBUFFEREDTRANSFORMATION_H__