cryptoplugins/cryptospiplugins/source/softwarecrypto/cmacimpl.h
changeset 19 cd501b96611d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cryptoplugins/cryptospiplugins/source/softwarecrypto/cmacimpl.h	Fri Nov 06 13:21:00 2009 +0200
@@ -0,0 +1,132 @@
+/*
+* Copyright (c) 2008-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: 
+* Cipher MAC plugin implementation
+*
+*/
+
+
+/**
+ @file
+ @internalComponent
+ @released
+*/
+
+#ifndef __CRYPTOAPI_SOFTWARECIPHERMACIMPL_H__
+#define __CRYPTOAPI_SOFTWARECIPHERMACIMPL_H__
+
+#include "cryptosymmetriccipherapi.h"
+#include "keys.h"
+
+
+namespace SoftwareCrypto
+	{
+	using namespace CryptoSpi;
+		
+	/**
+	 * This is the maximum block size in bytes currently supported by CMAC implementation.
+	 * 
+	 * The cipher based algorithms currently supported are
+	 * AES-XCBC-MAC-96 and AES-XCBC-PRF-128.
+	 */  
+	const TInt KMacBlockSize = 16;		
+	
+	/** 
+	 * The class is created from following substance classes
+	 * 1. MMac
+	 * 2. CSymmetricCipher
+	 * Using the methods of the above classes we will transform/mould the Cipher methods in
+	 * a way as to be inline with the MMac interface methods. The MMac methods will
+	 * serve as the wrapper internal to which Cipher methods will work to provide the MAC value.
+	 * 
+	 * The class was created to provide consistency/similarity HMAC and CMAC works.
+	 * Also for future extensibility of other Cipher algorithms.
+	 */		
+	NONSHARABLE_CLASS(CCMacImpl) : public CBase
+		{		
+	public:
+		/**
+		 * Cipher MAC implementation instance creation methods
+		 *
+		 *The owneship of 'aSymmetricCipher' is imparted to instance of this class.
+		 */
+		static CCMacImpl* NewL(const CKey& aKey,
+			        		   CSymmetricCipher* aSymmetricCipher,	
+				               TInt32 aAlgorithmUid);
+		
+		static CCMacImpl* NewLC(const CKey& aKey, 
+							    CSymmetricCipher* aSymmetricCipher,	
+							    TInt32 aAlgorithmUid);
+		/**
+		 * Simulating Methods from MPlugin
+		 */
+		const CExtendedCharacteristics* GetExtendedCharacteristicsL();
+		
+		// We will call CSymmetricBlockCipherImpl::Reset();
+		void Reset();
+		
+		/**
+		 *  Simulating MAC interfaces (Software based)
+		 */
+	    TPtrC8 MacL(const TDesC8& aMessage);
+        void UpdateL(const TDesC8& aMessage);
+        TPtrC8 FinalL(const TDesC8& aMessage);
+		void ReInitialiseAndSetKeyL(const CKey& aKey);    
+		void SetKeyL(const CKey& aKey);
+		~CCMacImpl();
+		CCMacImpl* CopyL();
+		CCMacImpl* ReplicateL();
+		
+	private:
+	    /**
+		 * Constructors
+		 */
+    	CCMacImpl(CryptoSpi::CSymmetricCipher* aSymmetricCipher);
+		CCMacImpl(const CCMacImpl&);
+		
+		/**
+		 * Initialize the 'iCipherImpl' instances.
+		 */
+		void ConstructL(const CKey& aKey, TInt32 aAlgorithmUid);
+		void DoUpdateL(const TDesC8& aMessage);
+		TPtrC8 DoFinalL();
+		void PadMessage();
+		void ProcessBlockL();
+		void XORKeyWithData(const TDesC8& aKey, TDes8& aOutput);
+		CKey* Create128bitKeyL(const CKey& aKey);		
+		
+	private:			
+		TInt32 iImplementationUid; 
+		CKey* iKey;
+		CryptoSpi::CSymmetricCipher* iCipherImpl;
+		
+		TBuf8<KMacBlockSize> iKey1;
+		TBuf8<KMacBlockSize> iKey2;
+		TBuf8<KMacBlockSize> iKey3;
+		TBuf8<KMacBlockSize> iMacValue;
+	
+		TUint8 iE[KMacBlockSize];
+		TUint8 iData[KMacBlockSize];
+		TInt iCurrentTotalLength;
+		// Resets the cipher with iE(128 zero bits) the next time MacL, 
+		// UpdateL or FinalL are called. This was introduced as we cannot leave from the
+		// non-leaving CCMacImpl::Reset() implementation of the MPlugin::Reset() pure 
+		// virtual. To prevent behavioral break.
+		TInt iDelayedReset;
+		};
+	}
+
+#endif // __CRYPTOAPI_SOFTWARECIPHERMACIMPL_H__
+
+