crypto/weakcrypto/inc/bufferedtransformation.h
changeset 0 2c201484c85f
child 8 35751d3474b7
--- /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 <e32std.h>
+#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__