crypto/weakcrypto/inc/padding.h
changeset 8 35751d3474b7
parent 0 2c201484c85f
child 29 ece3df019add
--- a/crypto/weakcrypto/inc/padding.h	Tue Jul 21 01:04:32 2009 +0100
+++ b/crypto/weakcrypto/inc/padding.h	Thu Sep 10 14:01:51 2009 +0300
@@ -1,368 +1,354 @@
-/*
-* 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.
-* Padding codes
-*
-*/
-
-
-
-
-/**
- @file 
- @publishedPartner
- @released
-*/
- 
-#ifndef __PADDING_H__
-#define __PADDING_H__
-
-#include <random.h>
-/** 
-* Abstract base class defining the interface to padding schemes.
-*
-* It is designed to be used by both symmetric and asymmetric ciphers.
-*
-* @publishedPartner
-* @released
-*/
-class CPadding : public CBase
-	{
-public:
-	/** 
-	* Pads aInput to be BlockSize() bytes long and places the result in aOutput.  
-	*
-	* @param aInput		Data to be padded.  The size must be less than or equal to
-	* 					BlockSize() minus MinPaddingLength().
-	* @param aOutput	On return, the resulting padded, block size aligned data
-	*					appended to aOutput.  
-	*/
-	IMPORT_C void PadL(const TDesC8& aInput,TDes8& aOutput);
-
-	/**
-	* Pads aInput to be BlockSize() long and places the result in aOutput.  
-	*
-	* Deriving implementations of DoPadL() can assume that aInput is less than or
-	* equal to BlockSize() minus MinPaddingLength().
-	*
-	* @param aInput		Data to be padded.  
-	* @param aOutput	On return, the resulting padded, aBlockBytes aligned data 
-	*					appended to aOutput.  
-	*/
-	virtual void DoPadL(const TDesC8& aInput,TDes8& aOutput) = 0;
-
-	/**
-	* Removes padding from aInput and appends unpadded result to aOutput.
-	* 
-	* @param aInput		Data to be unpadded.
-	* @param aOutput	On return, the unpadded data.
-	*/
-	virtual void UnPadL(const TDesC8& aInput,TDes8& aOutput) = 0;
-
-	/**
-	* Sets the block size for this padding system.
-	* 
-	* @param aBlockBytes	The block size in bytes.
-	*/
-	IMPORT_C void SetBlockSize(TInt aBlockBytes);
-
-	/**
-	* Retrieves the block size for this padding system.
-	*
-	* @return	The block size in bytes.
-	*/
-	IMPORT_C TInt BlockSize(void) const;
-
-	/**
-	* Gets the smallest number of bytes that PadL() will ever add to aInput in
-	* order to get a valid block aligned aOutput.  
-	*
-	* For example, in SSLv3 padding, if the block size is 8 and aInput is 7 bytes,
-	* it will append 1 byte of padding. For SSLv3 padding, this is the smallest 
-	* amount possible as an 8 byte input will add another block size (8 more bytes)
-	* of padded data.
-	* 
-	* @return	A TInt containing the smallest number of padding bytes possible.
-	*/
-	virtual TInt MinPaddingLength(void) const = 0;
-
-	/**
-	* Gets the size of the aOutput buffer, in a call to PadL(), must be in
-	* order to accommodate a block size of BlockSize() and an input size of
-	* aInputBytes.
-	* 
-	* @note	By default, this function returns the output of BlockSize().  If
-	*		a derived padding system outputs more than a single block of padding,
-	*		one must override this function and return the appropriate value.
-	*
-	* @param aInputBytes	The amount of data to be padded out in bytes.
-	* @return				A TInt representing the maximum amount of padded output data
-	*						(in bytes) for a given block and input size.
-	*/
-	IMPORT_C virtual TInt MaxPaddedLength(TInt aInputBytes) const;
-
-	/**
-	* Gets the size of the aOutput buffer, in a call to UnPadL(), must be in
-	* order to accommodate an input size of aInputBytes.
-	*
-	* @note	By default, this function returns the value of aInputBytes minus MinPaddingBytes().
-	*		Most padding systems cannot determine anything about the unpadded length
-	*		without looking at the data.  If your padding system allows you to give a
-	*		better bound, then you should reimplement this function.
-	*
-	* @param aInputBytes	The amount of data to be unpadded in bytes.
-	* @return				A TInt containing the maximum amount of unpadded output data
-	*						(in bytes) for a given padded input.
-	*/
-	IMPORT_C virtual TInt MaxUnPaddedLength(TInt aInputBytes) const;
-protected:
-	/** 
-	* Constructor
-	* 
-	* @param aBlockBytes	The block size in bytes.
-	*/
-	IMPORT_C CPadding(TInt aBlockBytes);
-private:
-	CPadding(void);
-	CPadding(const CPadding&);
-	CPadding& operator=(const CPadding&);
-private:
-	TInt iBlockBytes;
-	};
-
-/**
-* This concrete subclass of CPadding appends no padding.
-*
-* aOutput will be a copy of aInput after any call to PadL() or UnPadL().
-*
-* @publishedPartner
-* @released
-*/
-class CPaddingNone:public CPadding
-	{
-public:
-	/**
-	* Creates a new CPaddingNone object.
-	*
-	* @param aBlockBytes	The block size in bytes.
-	* @return				A pointer to the new CPaddingNone object.
-	*/
-	IMPORT_C static CPaddingNone* NewL(TInt aBlockBytes=KMaxTInt);
-
-	/**
-	* Creates a new CPaddingNone object and leaves a pointer to it on the cleanup stack.
-	* 
-	* @param aBlockBytes	The block size in bytes.
-	* @return				A pointer to the new CPaddingNone object.
-	*/
-	IMPORT_C static CPaddingNone* NewLC(TInt aBlockBytes=KMaxTInt);
-	void DoPadL(const TDesC8& aInput,TDes8& aOutput);
-	void UnPadL(const TDesC8& aInput,TDes8& aOutput);
-	TInt MinPaddingLength(void) const;
-	TInt MaxPaddedLength(TInt aInputBytes) const;
-protected:
-	/** 
-	* Constructor
-	* 
-	* @param aBlockBytes	The block size in bytes.
-	*/
-	IMPORT_C CPaddingNone(TInt aBlockBytes);
-private:
-	CPaddingNone(void);
-	CPaddingNone(const CPaddingNone&);
-	CPaddingNone& operator=(const CPaddingNone&);
-	};
-
-/**
-* This concrete subclass of CPadding implements PKCS#1 v1.5 signature padding.
-*
-* It is intended for use with RSA signing/verifying.
-*
-* @publishedPartner
-* @released
-*/
-class CPaddingPKCS1Signature : public CPadding
-	{
-public:
-	/**
-	* Creates a new CPaddingPKCS1Signature object.
-	*
-	* @param aBlockBytes	The block size in bytes.
-	* @return				A pointer to the new CPaddingPKCS1Signature object.
-	*/
-	IMPORT_C static CPaddingPKCS1Signature* NewL(TInt aBlockBytes);
-
-	/**
-	* Creates a new CPaddingPKCS1Signature object and leaves a pointer to it on the
-	* cleanup stack.
-	*
-	* @param aBlockBytes	The block size in bytes.
-	* @return				A pointer to the new CPaddingPKCS1Signature object.
-	*/
-	IMPORT_C static CPaddingPKCS1Signature* CPaddingPKCS1Signature::NewLC(
-		TInt aBlockBytes);
-	void DoPadL(const TDesC8& aInput,TDes8& aOutput);
-	void UnPadL(const TDesC8& aInput,TDes8& aOutput);
-	TInt MinPaddingLength(void) const;
-protected:
-	/** 
-	* Constructor
-	* 
-	* @param aBlockBytes	The block size in bytes.
-	*/
-	IMPORT_C CPaddingPKCS1Signature(TInt aBlockBytes);
-private:
-	CPaddingPKCS1Signature(void);
-	CPaddingPKCS1Signature(const CPaddingPKCS1Signature&);
-	CPaddingPKCS1Signature& operator=(const CPaddingPKCS1Signature&);
-	};
-
-/**
-* This concrete subclass of CPadding implements PKCS#1 v1.5 encryption padding.
-* It is intended for use with RSA encryption/decryption.
-*
-* @publishedPartner
-* @released
-*/
-class CPaddingPKCS1Encryption : public CPadding
-	{
-public:
-	/**
-	* Creates a new CPaddingPKCS1Encryption object.
-	*
-	* @param aBlockBytes	The block size in bytes.
-	* @return				A pointer to the new CPaddingPKCS1Encryption object.
-	*/
-	IMPORT_C static CPaddingPKCS1Encryption* NewL(TInt aBlockBytes);
-
-	/**
-	* Creates a new CPaddingPKCS1Encryption object and leaves a pointer to it on the
-	* cleanup stack.
-	*
-	* @param aBlockBytes	The block size in bytes.
-	* @return				A pointer to the new CPaddingPKCS1Encryption object.
-	*/
-	IMPORT_C static CPaddingPKCS1Encryption* NewLC(TInt aBlockBytes);
-	void DoPadL(const TDesC8& aInput,TDes8& aOutput);
-	void UnPadL(const TDesC8& aInput,TDes8& aOutput);
-	TInt MinPaddingLength(void) const;
-protected:
-	/** 
-	* Constructor
-	* 
-	* @param aBlockBytes	The block size in bytes.
-	*/
-	IMPORT_C CPaddingPKCS1Encryption(TInt aBlockBytes);
-private:
-	CPaddingPKCS1Encryption(void);
-	CPaddingPKCS1Encryption(const CPaddingPKCS1Encryption&);
-	CPaddingPKCS1Encryption& operator=(const CPaddingPKCS1Encryption&);
-	};
-
-/**
-* This concrete subclass of CPadding implements padding according to 
-* the SSLv3/TLS standard.
-*
-* The SSL 3.0 spec does not specifiy the padding bytes to be used - it is
-* assumed to be arbitrary (and the openssl implementation uses non-zero random
-* data).  The TLS spec however states that padding bytes should be the length
-* of the padding - 1.  This class implements the latter when padding, but does
-* not check the padding byes when unpadding, so as to be interoperable with SSL
-* 3.0.
-* 
-* @publishedPartner
-* @released
-*/
-class CPaddingSSLv3 : public CPadding
-	{
-public:
-	/**
-	* Creates a new CPaddingSSLv3 object.
-	*
-	* @param aBlockBytes	The block size in bytes.
-	* @return				A pointer to the new CPaddingSSLv3 object.
-	*/
-	IMPORT_C static CPaddingSSLv3* NewL(TInt aBlockBytes);
-
-	/**
-	* Creates a new CPaddingSSLv3 object and leaves a pointer to it on the cleanup stack.
-	*
-	* @param aBlockBytes	The block size in bytes.
-	* @return				A pointer to the new CPaddingSSLv3 object.
-	*/
-	IMPORT_C static CPaddingSSLv3* NewLC(TInt aBlockBytes);
-	void DoPadL(const TDesC8& aInput,TDes8& aOutput);
-	void UnPadL(const TDesC8& aInput,TDes8& aOutput);
-	TInt MinPaddingLength(void) const;
-	TInt MaxPaddedLength(TInt aInputBytes) const;
-
-protected:
-	/** 
-	* Constructor
-	* 
-	* @param aBlockBytes	The block size in bytes.
-	*/
-	IMPORT_C CPaddingSSLv3(TInt aBlockBytes);
-private:
-	CPaddingSSLv3(void);
-	CPaddingSSLv3(const CPaddingSSLv3&);
-	CPaddingSSLv3& operator=(const CPaddingSSLv3&);
-	};
-
-/**
-* This concrete subclass of CPadding implements padding according to 
-* the PKCS#7/TLS standard.
-*
-* @publishedPartner
-* @released
-*/
-class CPaddingPKCS7 : public CPadding
-	{
-public:
-	/**
-	* Creates a new CPaddingPKCS7 object.
-	* 
-	* @param aBlockBytes	The block size in bytes.
-	* @return				A pointer to the new CPaddingPKCS7 object.
-	*/
-	IMPORT_C static CPaddingPKCS7* NewL(TInt aBlockBytes);
-
-	/**
-	* Creates a new CPaddingPKCS7 object and leaves a pointer to it on the cleanup stack.
-	*
-	* @param aBlockBytes	The block size in bytes.
-	* @return				A pointer to the new CPaddingPKCS7 object.
-	*/
-	IMPORT_C static CPaddingPKCS7* NewLC(TInt aBlockBytes);
-	void DoPadL(const TDesC8& aInput,TDes8& aOutput);
-	void UnPadL(const TDesC8& aInput,TDes8& aOutput);
-	TInt MinPaddingLength(void) const;
-	TInt MaxPaddedLength(TInt aInputBytes) const;
-
-protected:
-	/** 
-	* Constructor
-	* 
-	* @param aBlockBytes	The block size in bytes.
-	*/
-	IMPORT_C CPaddingPKCS7(TInt aBlockBytes);
-private:
-	CPaddingPKCS7(void);
-	CPaddingPKCS7(const CPaddingPKCS7&);
-	CPaddingPKCS7& operator=(const CPaddingPKCS7&);
-	};
-
-#endif
+/*
+* 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 **  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.
+* Padding codes
+*
+*/
+
+
+/**
+ @file 
+ @publishedAll
+ @released
+*/
+ 
+#ifndef __PADDING_H__
+#define __PADDING_H__
+
+#include <random.h>
+/** 
+* Abstract base class defining the interface to padding schemes.
+*
+* It is designed to be used by both symmetric and asymmetric ciphers.
+*
+*/
+class CPadding : public CBase
+	{
+public:
+	/** 
+	* Pads aInput to be BlockSize() bytes long and places the result in aOutput.  
+	*
+	* @param aInput		Data to be padded.  The size must be less than or equal to
+	* 					BlockSize() minus MinPaddingLength().
+	* @param aOutput	On return, the resulting padded, block size aligned data
+	*					appended to aOutput.  
+	*/
+	IMPORT_C void PadL(const TDesC8& aInput,TDes8& aOutput);
+
+	/**
+	* Pads aInput to be BlockSize() long and places the result in aOutput.  
+	*
+	* Deriving implementations of DoPadL() can assume that aInput is less than or
+	* equal to BlockSize() minus MinPaddingLength().
+	*
+	* @param aInput		Data to be padded.  
+	* @param aOutput	On return, the resulting padded, aBlockBytes aligned data 
+	*					appended to aOutput.  
+	*/
+	virtual void DoPadL(const TDesC8& aInput,TDes8& aOutput) = 0;
+
+	/**
+	* Removes padding from aInput and appends unpadded result to aOutput.
+	* 
+	* @param aInput		Data to be unpadded.
+	* @param aOutput	On return, the unpadded data.
+	*/
+	virtual void UnPadL(const TDesC8& aInput,TDes8& aOutput) = 0;
+
+	/**
+	* Sets the block size for this padding system.
+	* 
+	* @param aBlockBytes	The block size in bytes.
+	*/
+	IMPORT_C void SetBlockSize(TInt aBlockBytes);
+
+	/**
+	* Retrieves the block size for this padding system.
+	*
+	* @return	The block size in bytes.
+	*/
+	IMPORT_C TInt BlockSize(void) const;
+
+	/**
+	* Gets the smallest number of bytes that PadL() will ever add to aInput in
+	* order to get a valid block aligned aOutput.  
+	*
+	* For example, in SSLv3 padding, if the block size is 8 and aInput is 7 bytes,
+	* it will append 1 byte of padding. For SSLv3 padding, this is the smallest 
+	* amount possible as an 8 byte input will add another block size (8 more bytes)
+	* of padded data.
+	* 
+	* @return	A TInt containing the smallest number of padding bytes possible.
+	*/
+	virtual TInt MinPaddingLength(void) const = 0;
+
+	/**
+	* Gets the size of the aOutput buffer, in a call to PadL(), must be in
+	* order to accommodate a block size of BlockSize() and an input size of
+	* aInputBytes.
+	* 
+	* @note	By default, this function returns the output of BlockSize().  If
+	*		a derived padding system outputs more than a single block of padding,
+	*		one must override this function and return the appropriate value.
+	*
+	* @param aInputBytes	The amount of data to be padded out in bytes.
+	* @return				A TInt representing the maximum amount of padded output data
+	*						(in bytes) for a given block and input size.
+	*/
+	IMPORT_C virtual TInt MaxPaddedLength(TInt aInputBytes) const;
+
+	/**
+	* Gets the size of the aOutput buffer, in a call to UnPadL(), must be in
+	* order to accommodate an input size of aInputBytes.
+	*
+	* @note	By default, this function returns the value of aInputBytes minus MinPaddingBytes().
+	*		Most padding systems cannot determine anything about the unpadded length
+	*		without looking at the data.  If your padding system allows you to give a
+	*		better bound, then you should reimplement this function.
+	*
+	* @param aInputBytes	The amount of data to be unpadded in bytes.
+	* @return				A TInt containing the maximum amount of unpadded output data
+	*						(in bytes) for a given padded input.
+	*/
+	IMPORT_C virtual TInt MaxUnPaddedLength(TInt aInputBytes) const;
+protected:
+	/** 
+	* Constructor
+	* 
+	* @param aBlockBytes	The block size in bytes.
+	*/
+	IMPORT_C CPadding(TInt aBlockBytes);
+private:
+	CPadding(void);
+	CPadding(const CPadding&);
+	CPadding& operator=(const CPadding&);
+private:
+	TInt iBlockBytes;
+	};
+
+/**
+* This concrete subclass of CPadding appends no padding.
+*
+* aOutput will be a copy of aInput after any call to PadL() or UnPadL().
+*
+*/
+class CPaddingNone:public CPadding
+	{
+public:
+	/**
+	* Creates a new CPaddingNone object.
+	*
+	* @param aBlockBytes	The block size in bytes.
+	* @return				A pointer to the new CPaddingNone object.
+	*/
+	IMPORT_C static CPaddingNone* NewL(TInt aBlockBytes=KMaxTInt);
+
+	/**
+	* Creates a new CPaddingNone object and leaves a pointer to it on the cleanup stack.
+	* 
+	* @param aBlockBytes	The block size in bytes.
+	* @return				A pointer to the new CPaddingNone object.
+	*/
+	IMPORT_C static CPaddingNone* NewLC(TInt aBlockBytes=KMaxTInt);
+	void DoPadL(const TDesC8& aInput,TDes8& aOutput);
+	void UnPadL(const TDesC8& aInput,TDes8& aOutput);
+	TInt MinPaddingLength(void) const;
+	TInt MaxPaddedLength(TInt aInputBytes) const;
+protected:
+	/** 
+	* Constructor
+	* 
+	* @param aBlockBytes	The block size in bytes.
+	*/
+	IMPORT_C CPaddingNone(TInt aBlockBytes);
+private:
+	CPaddingNone(void);
+	CPaddingNone(const CPaddingNone&);
+	CPaddingNone& operator=(const CPaddingNone&);
+	};
+
+/**
+* This concrete subclass of CPadding implements PKCS#1 v1.5 signature padding.
+*
+* It is intended for use with RSA signing/verifying.
+*
+*/
+class CPaddingPKCS1Signature : public CPadding
+	{
+public:
+	/**
+	* Creates a new CPaddingPKCS1Signature object.
+	*
+	* @param aBlockBytes	The block size in bytes.
+	* @return				A pointer to the new CPaddingPKCS1Signature object.
+	*/
+	IMPORT_C static CPaddingPKCS1Signature* NewL(TInt aBlockBytes);
+
+	/**
+	* Creates a new CPaddingPKCS1Signature object and leaves a pointer to it on the
+	* cleanup stack.
+	*
+	* @param aBlockBytes	The block size in bytes.
+	* @return				A pointer to the new CPaddingPKCS1Signature object.
+	*/
+	IMPORT_C static CPaddingPKCS1Signature* CPaddingPKCS1Signature::NewLC(
+		TInt aBlockBytes);
+	void DoPadL(const TDesC8& aInput,TDes8& aOutput);
+	void UnPadL(const TDesC8& aInput,TDes8& aOutput);
+	TInt MinPaddingLength(void) const;
+protected:
+	/** 
+	* Constructor
+	* 
+	* @param aBlockBytes	The block size in bytes.
+	*/
+	IMPORT_C CPaddingPKCS1Signature(TInt aBlockBytes);
+private:
+	CPaddingPKCS1Signature(void);
+	CPaddingPKCS1Signature(const CPaddingPKCS1Signature&);
+	CPaddingPKCS1Signature& operator=(const CPaddingPKCS1Signature&);
+	};
+
+/**
+* This concrete subclass of CPadding implements PKCS#1 v1.5 encryption padding.
+* It is intended for use with RSA encryption/decryption.
+*
+*/
+class CPaddingPKCS1Encryption : public CPadding
+	{
+public:
+	/**
+	* Creates a new CPaddingPKCS1Encryption object.
+	*
+	* @param aBlockBytes	The block size in bytes.
+	* @return				A pointer to the new CPaddingPKCS1Encryption object.
+	*/
+	IMPORT_C static CPaddingPKCS1Encryption* NewL(TInt aBlockBytes);
+
+	/**
+	* Creates a new CPaddingPKCS1Encryption object and leaves a pointer to it on the
+	* cleanup stack.
+	*
+	* @param aBlockBytes	The block size in bytes.
+	* @return				A pointer to the new CPaddingPKCS1Encryption object.
+	*/
+	IMPORT_C static CPaddingPKCS1Encryption* NewLC(TInt aBlockBytes);
+	void DoPadL(const TDesC8& aInput,TDes8& aOutput);
+	void UnPadL(const TDesC8& aInput,TDes8& aOutput);
+	TInt MinPaddingLength(void) const;
+protected:
+	/** 
+	* Constructor
+	* 
+	* @param aBlockBytes	The block size in bytes.
+	*/
+	IMPORT_C CPaddingPKCS1Encryption(TInt aBlockBytes);
+private:
+	CPaddingPKCS1Encryption(void);
+	CPaddingPKCS1Encryption(const CPaddingPKCS1Encryption&);
+	CPaddingPKCS1Encryption& operator=(const CPaddingPKCS1Encryption&);
+	};
+
+/**
+* This concrete subclass of CPadding implements padding according to 
+* the SSLv3/TLS standard.
+*
+* The SSL 3.0 spec does not specifiy the padding bytes to be used - it is
+* assumed to be arbitrary (and the openssl implementation uses non-zero random
+* data).  The TLS spec however states that padding bytes should be the length
+* of the padding - 1.  This class implements the latter when padding, but does
+* not check the padding byes when unpadding, so as to be interoperable with SSL
+* 3.0.
+* 
+*/
+class CPaddingSSLv3 : public CPadding
+	{
+public:
+	/**
+	* Creates a new CPaddingSSLv3 object.
+	*
+	* @param aBlockBytes	The block size in bytes.
+	* @return				A pointer to the new CPaddingSSLv3 object.
+	*/
+	IMPORT_C static CPaddingSSLv3* NewL(TInt aBlockBytes);
+
+	/**
+	* Creates a new CPaddingSSLv3 object and leaves a pointer to it on the cleanup stack.
+	*
+	* @param aBlockBytes	The block size in bytes.
+	* @return				A pointer to the new CPaddingSSLv3 object.
+	*/
+	IMPORT_C static CPaddingSSLv3* NewLC(TInt aBlockBytes);
+	void DoPadL(const TDesC8& aInput,TDes8& aOutput);
+	void UnPadL(const TDesC8& aInput,TDes8& aOutput);
+	TInt MinPaddingLength(void) const;
+	TInt MaxPaddedLength(TInt aInputBytes) const;
+
+protected:
+	/** 
+	* Constructor
+	* 
+	* @param aBlockBytes	The block size in bytes.
+	*/
+	IMPORT_C CPaddingSSLv3(TInt aBlockBytes);
+private:
+	CPaddingSSLv3(void);
+	CPaddingSSLv3(const CPaddingSSLv3&);
+	CPaddingSSLv3& operator=(const CPaddingSSLv3&);
+	};
+
+/**
+* This concrete subclass of CPadding implements padding according to 
+* the PKCS#7/TLS standard.
+*
+*/
+class CPaddingPKCS7 : public CPadding
+	{
+public:
+	/**
+	* Creates a new CPaddingPKCS7 object.
+	* 
+	* @param aBlockBytes	The block size in bytes.
+	* @return				A pointer to the new CPaddingPKCS7 object.
+	*/
+	IMPORT_C static CPaddingPKCS7* NewL(TInt aBlockBytes);
+
+	/**
+	* Creates a new CPaddingPKCS7 object and leaves a pointer to it on the cleanup stack.
+	*
+	* @param aBlockBytes	The block size in bytes.
+	* @return				A pointer to the new CPaddingPKCS7 object.
+	*/
+	IMPORT_C static CPaddingPKCS7* NewLC(TInt aBlockBytes);
+	void DoPadL(const TDesC8& aInput,TDes8& aOutput);
+	void UnPadL(const TDesC8& aInput,TDes8& aOutput);
+	TInt MinPaddingLength(void) const;
+	TInt MaxPaddedLength(TInt aInputBytes) const;
+
+protected:
+	/** 
+	* Constructor
+	* 
+	* @param aBlockBytes	The block size in bytes.
+	*/
+	IMPORT_C CPaddingPKCS7(TInt aBlockBytes);
+private:
+	CPaddingPKCS7(void);
+	CPaddingPKCS7(const CPaddingPKCS7&);
+	CPaddingPKCS7& operator=(const CPaddingPKCS7&);
+	};
+
+#endif