crypto/weakcryptospi/examples/mac_api_usage/t_mac_example.cpp
changeset 8 35751d3474b7
child 43 2f10d260163b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/crypto/weakcryptospi/examples/mac_api_usage/t_mac_example.cpp	Thu Sep 10 14:01:51 2009 +0300
@@ -0,0 +1,171 @@
+/*
+* 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: 
+* Example Code for showing usage of MAC APIs. 
+*
+*/
+
+
+/**
+ @file
+ @internalTechnology
+ @released
+*/
+
+#include <cryptospi/cryptospidef.h>
+#include <cryptospi/cryptomacapi.h>
+#include <cryptospi/cryptoparams.h>
+#include "keys.h"
+#include <f32file.h>
+#include "utf.h" 
+
+using namespace CryptoSpi;
+
+
+const TUint8 KMacBlockSize = 16;                                                               
+
+const TUint8 key[]  = 	{
+						 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+						 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+						};
+
+const TUint8 data[] = 	{
+						 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+						 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
+						};
+
+
+#define __CLEAN_UP 	logBuffer = CnvUtfConverter::ConvertFromUnicodeToUtf8L(*macResult); \
+					CleanupStack::PopAndDestroy(macResult);  \
+					CleanupStack::PushL(logBuffer); \
+					User::LeaveIfError(log.Write(*logBuffer)); \
+					CleanupStack::PopAndDestroy(logBuffer);  
+
+
+class TVariantPtrC : public TPtrC
+	{
+	public:
+	HBufC* HexStringLC();
+	};                                  
+
+HBufC* TVariantPtrC::HexStringLC()
+	{
+	HBufC* parsedString = HBufC::NewLC(this->Length()*2);
+	TBuf<2> pair;
+	_LIT(KFormat2,"%02x");                                    
+						    
+   	for(TInt i = 0; i<this->Length() ; ++i)
+    	{
+		TInt num  = (*this)[i];
+    	pair.Format(KFormat2,num);
+    	parsedString->Des().Append(pair);
+    	}
+	    
+	return parsedString;
+	}
+
+void EvaluateMacL(const TDesC8& aKey, const TDesC8& aSourceData)
+	{
+	//-----------------------------CREATION-OF-KEY-AND-MAC-INSTANCE--------------------------
+
+	// Set the key
+	CryptoSpi::TKeyProperty keyProperty = {CryptoSpi::KAesUid, KNullUid, CryptoSpi::KSymmetricKey, CryptoSpi::KNonEmbeddedKeyUid};
+	CCryptoParams* keyParam =CCryptoParams::NewLC();
+	keyParam->AddL(aKey, CryptoSpi::KSymmetricKeyParameterUid);
+	CKey* uniKey=CKey::NewLC(keyProperty, *keyParam);
+	
+	//Retrieve a Synchronous MAC Factory Object and use AES-XCBC-MAC-96 or any other MAC algorithm.
+	CMac* macImpl = NULL;
+	CMacFactory::CreateMacL(macImpl, CryptoSpi::KAesXcbcMac96Uid,*uniKey, NULL);
+
+	//cleanup uniKey and keyParam.
+	CleanupStack::PopAndDestroy(2,keyParam);
+	CleanupStack::PushL(macImpl);
+	
+	//---------------------------------EVALUATION-OF-MAC-VALUE---------------------------------
+	
+	// Usage of Mac APIs: MacL, UpdateL, and FinalL 
+	
+	//Retrieve the 8bit mac value
+	HBufC* macValueIntermediate = HBufC::NewLC(KMacBlockSize);
+	HBufC* macValueFinal        = HBufC::NewLC(KMacBlockSize);
+
+	TPtr macPtrIntermediate = macValueIntermediate->Des();
+	TPtr macPtrFinal 		= macValueFinal->Des();
+	
+	//Retrieve the final 8bit mac value and convert to 16bit
+	macPtrIntermediate.Copy(macImpl->MacL(aSourceData.Mid(0,3)));
+	macImpl->UpdateL(aSourceData.Mid(3,5));
+	macPtrFinal.Copy(macImpl->FinalL(aSourceData.Mid(8,8)));
+
+	//---------------------------------WRITE-RESULTS-TO-LOG--------------------------
+
+	// Add log file for automated test environment
+	RFs fs;
+	User::LeaveIfError(fs.Connect());
+	CleanupClosePushL(fs);
+	RFile log;
+	CleanupClosePushL(log);
+	User::LeaveIfError(log.Replace(fs, _L("c:\\t_mac_apis.log"), EFileShareAny|EFileWrite));
+	User::LeaveIfError(log.Write(_L8("\n*** Key Used for Mac Evaluation (in hex) is = 0x000102030405060708090a0b0c0d0e0f ")));
+
+	
+	//Take the 16bit descriptor and convert the string to hexadecimal
+	TVariantPtrC convertMac;
+	convertMac.Set(macPtrIntermediate);
+	HBufC* macResult = convertMac.HexStringLC();	
+	HBufC8* logBuffer = NULL;
+	
+	User::LeaveIfError(log.Write(_L8("\n*** Mac value for hex data 0x000102 is = ")));
+	
+	// cleanup macResult and logBuffer
+	__CLEAN_UP;
+	
+	convertMac.Set(macPtrFinal);
+	macResult = convertMac.HexStringLC();
+	
+	User::LeaveIfError(log.Write(_L8("\n*** Mac value for hex data 0x000102030405060708090a0b0c0d0e0f is = ")));
+	
+	// cleanup macResult and logBuffer
+	__CLEAN_UP
+	
+	User::LeaveIfError(log.Write(_L8("\n\n 0 tests failed out of 1 \t\n")));
+	//------------------------------------------CLEANUP------------------------------------------
+
+	//cleanup log, fs, macValueFinal, macValueIntermediate and macImpl
+	CleanupStack::PopAndDestroy(5, macImpl);
+	}
+
+void MainL()
+	{
+	const TPtrC8 Key(key, KMacBlockSize);
+	const TPtrC8 Data(data, KMacBlockSize);
+
+	// pass the key and the source data for MAC evaluation
+	__UHEAP_MARK;
+		EvaluateMacL(Key,Data);
+	__UHEAP_MARKEND;
+	}
+
+TInt E32Main()
+	{
+ 	CTrapCleanup* cleanupStack = CTrapCleanup::New();
+ 	if (cleanupStack == NULL)
+ 		{
+ 		return KErrNoMemory;
+ 		}
+ 	TRAP_IGNORE(MainL());
+ 	delete cleanupStack;
+ 	return KErrNone;
+	}