telephonyserverplugins/simtsy/src/csimsmartcardauth.cpp
changeset 0 3553901f7fa8
child 24 6638e7f4bd8f
child 42 3adadc800673
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/simtsy/src/csimsmartcardauth.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,1072 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "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:
+//
+
+/**
+ @file
+*/
+
+#include <testconfigfileparser.h>
+#include "CSimPhone.h"
+#include "Simlog.h"
+#include "csimsmartcardauth.h"
+#include "utils.h"
+
+CSimSmartCardAuth* CSimSmartCardAuth::NewL(CSimPhone *aPhone)
+	{
+	CSimSmartCardAuth* obj = new(ELeave) CSimSmartCardAuth(aPhone);
+	CleanupStack::PushL(obj);
+	obj->ConstructL();
+	CleanupStack::Pop(obj);
+	return obj;
+	}
+
+CSimSmartCardAuth::CSimSmartCardAuth(CSimPhone *aPhone)
+: iPhone(aPhone)
+	{
+	iGBAAuthInfoList = new (ELeave) CArrayFixFlat<TGBAAuthInfo> (1);
+	iMBMSInfoList = new (ELeave) CArrayFixFlat<TMBMSInfo> (1);
+	}
+
+void CSimSmartCardAuth::ConstructL()
+	{
+	ParseAuthInfoL();
+	ParseGBAAuthInfoL();
+	ParseMBMSAuthInfoL();
+	LOGPHONE1("CSimSmartCardAuth created");
+	}
+
+CSimSmartCardAuth::~CSimSmartCardAuth()
+	{
+	iAuthInfoList.Close();
+	if(iGBAAuthInfoList)
+		{
+		iGBAAuthInfoList->Delete(0,iGBAAuthInfoList->Count());
+		delete iGBAAuthInfoList;
+		}
+	if(iMBMSInfoList)
+		{
+		iMBMSInfoList->Delete(0,iMBMSInfoList->Count());
+		delete iMBMSInfoList;
+		}
+	LOGPHONE1("CSimSmartCardAuth destroyed");
+	}
+
+TInt CSimSmartCardAuth::GetScAuthenticationData(const TTsyReqHandle aTsyReqHandle, TDes8* aPckg1, const RMobilePhone::TAID* aAID)
+	{
+
+	LOGPHONE1("CSimSmartCardAuth::GetScAuthenticationData called");
+
+	RMobilePhone::TSmartCardAuthenticateDataV6Pckg
+			* authenticateDataPckgd =reinterpret_cast<RMobilePhone::TSmartCardAuthenticateDataV6Pckg*>(aPckg1);
+	RMobilePhone::TSmartCardAuthenticateDataV6& authenticateData=(*authenticateDataPckgd) ();
+
+	// Check that the data structure is supported by the simulated TSY version
+	TInt err = iPhone->CheckSimTsyVersion (authenticateData);
+	if ( err != KErrNone)
+		{
+		iPhone->ReqCompleted (aTsyReqHandle, err);
+		return KErrNone;
+		}
+	
+	
+	if ( authenticateData.ExtensionId ()== RMobilePhone::KETelMobileGbaBootstrapAuthDataV8)
+		{
+		RMobilePhone::TGbaBootstrapAuthDataV8Pckg
+				* tGbaBootstrapAuthDataV8Pckgd =reinterpret_cast<RMobilePhone::TGbaBootstrapAuthDataV8Pckg*> (aPckg1);
+		RMobilePhone::TGbaBootstrapAuthDataV8 tGbaBootstrapAuthDataV8 = (*tGbaBootstrapAuthDataV8Pckgd) ();
+
+			// This is the USIM authorisation.
+			if ( ((aAID == NULL) || (*aAID == iGBAAuthInfoList->At(index).iAID)) 
+					&&tGbaBootstrapAuthDataV8.iAUTN == iGBAAuthInfoList->At(index).iAUTN 
+					&&tGbaBootstrapAuthDataV8.iRAND == iGBAAuthInfoList->At(index).iRAND)
+				{
+				TInt ret = iGBAAuthInfoList->At(index).iAuthErr;
+				if ( ret != KErrNone)
+					{
+					// Return the AUTS and blank everything else
+					tGbaBootstrapAuthDataV8.iAUTS = iGBAAuthInfoList->At(index).iAUTS;
+					tGbaBootstrapAuthDataV8.iRES = _L8("");
+					tGbaBootstrapAuthDataV8.iIK = _L8("");
+					tGbaBootstrapAuthDataV8.iCK = _L8("");
+					if ( ret == KErrMMEtelScApplicationNotActive)
+						{
+						if ( !(iGBAAuthInfoList->At(index).iApplnActive == EFalse))
+							{
+							iPhone->ReqCompleted (aTsyReqHandle, KErrCorrupt);
+							return KErrNone;
+							}
+						}
+					}
+				else
+					{
+					tGbaBootstrapAuthDataV8.iRES = iGBAAuthInfoList->At(index).iRES;
+					tGbaBootstrapAuthDataV8.iAUTS = _L8("");
+					tGbaBootstrapAuthDataV8.iIK = _L8("");
+					tGbaBootstrapAuthDataV8.iCK = _L8("");
+					}
+
+				iPhone->ReqCompleted (aTsyReqHandle, ret);
+				//iGBAAuthInfoList->Delete(index);
+				return KErrNone;
+				}
+			iPhone->ReqCompleted (aTsyReqHandle, KErrArgument);
+			return KErrNone;
+		}
+	else if (authenticateData.ExtensionId ()== RMobilePhone::KETelMobileGbaNafAuthDataV8)
+		{
+		RMobilePhone::TGbaNafAuthDataV8Pckg *gbaNafAuthPckg =
+				reinterpret_cast<RMobilePhone::TGbaNafAuthDataV8Pckg*>(aPckg1);
+
+		RMobilePhone::TGbaNafAuthDataV8 &gbaNafAuthData=  (*gbaNafAuthPckg)();
+		// This is the USIM authorisation.
+			if ( ((aAID == NULL) || (*aAID == iGBAAuthInfoList->At(index).iAID)) 
+					&&gbaNafAuthData.iImpi == iGBAAuthInfoList->At(index).iIMPI 
+					&&gbaNafAuthData.iNafId == iGBAAuthInfoList->At(index).iNAFID)
+				{
+				TInt ret = iGBAAuthInfoList->At(index).iAuthErr;
+				if ( ret != KErrNone)
+					{
+					// return the Ks_Ext_NAF as NULL
+					gbaNafAuthData.iKsExtNaf = _L8("");
+					if ( ret == KErrMMEtelAuthKeyNotFound)
+						{
+						if ( !(iGBAAuthInfoList->At(index).iRAND == _L8("INV_RAND")))
+							{
+							iPhone->ReqCompleted (aTsyReqHandle, KErrCorrupt);
+							return KErrNone;
+							}
+						}
+					if ( ret == KErrMMEtelScApplicationNotActive)
+						{
+						if ( !(iGBAAuthInfoList->At(index).iApplnActive == EFalse))
+							{
+							iPhone->ReqCompleted (aTsyReqHandle, KErrCorrupt);
+							return KErrNone;
+							}
+						}
+					}
+				else
+					{
+					gbaNafAuthData.iKsExtNaf = iGBAAuthInfoList->At(index).iKsExtNaf;
+					}
+
+				iPhone->ReqCompleted (aTsyReqHandle, ret);
+				return KErrNone;
+				}
+			iPhone->ReqCompleted (aTsyReqHandle, KErrArgument);
+			return KErrNone;
+			}
+	else if ( authenticateData.ExtensionId ()== RMobilePhone::KETelMobileMbmsMskUpdateDataV8)
+			{
+			RMobilePhone::TMbmsMskUpdateDataV8Pckg
+					*tTMbmsMskUpdateDataV8Pckg =reinterpret_cast<RMobilePhone::TMbmsMskUpdateDataV8Pckg*> (aPckg1);
+
+			RMobilePhone::TMbmsMskUpdateDataV8 &tTMbmsMskUpdateDataV8= (*tTMbmsMskUpdateDataV8Pckg) ();
+
+			if ( ((aAID == NULL) || (*aAID == iMBMSInfoList->At(index).iAID))
+					&& tTMbmsMskUpdateDataV8.iInputMikey == iMBMSInfoList->At(index).iInputMikey)
+				{
+				TInt ret = iMBMSInfoList->At(index).iAuthErr;
+				if ( ret != KErrNone)
+					{
+					// return the Ks_Ext_NAF as NULL
+					tTMbmsMskUpdateDataV8.iOutputMikey = _L8 ("");
+					if ( ret == KErrMMEtelAuthKeyNotFound)
+						{
+						/* Checking for the hardcoded (existing) KsIntNAF with the one in config file 
+						 * If different, it means that the KsIntNaf has been overwritten 
+						 */
+						if ((iMBMSInfoList->At(index).iKsIntNaf == _L8("CORRECT_KS_INT")))
+							{
+							iPhone->ReqCompleted (aTsyReqHandle,KErrCorrupt);
+							index++;
+							return KErrNone;
+							}
+						if(!(iMBMSInfoList->At(index).iMukIdTlv == _L8("INVALID_MUKID")))
+							{
+							iPhone->ReqCompleted (aTsyReqHandle,KErrCorrupt);
+							index++;
+							return KErrNone;
+							}
+						}
+					if ( ret == KErrMMEtelScApplicationNotActive)
+						{
+						if ( !(iMBMSInfoList->At(index).iApplnActive == EFalse))
+							{
+							iPhone->ReqCompleted (aTsyReqHandle,KErrCorrupt);
+							index++;
+							return KErrNone;
+							}
+						}
+					}
+				else
+					{
+					tTMbmsMskUpdateDataV8.iOutputMikey = iMBMSInfoList->At(index).iOutputMikey;
+					}
+
+				iPhone->ReqCompleted (aTsyReqHandle, ret);
+				index++;
+				return KErrNone;
+				}
+
+			iPhone->ReqCompleted (aTsyReqHandle, KErrArgument);
+			index++;
+			return KErrNone;
+			}
+	else if ( authenticateData.ExtensionId ()== RMobilePhone::KETelMobileMbmsMtkGenerateDataV8)
+		{
+		RMobilePhone::TMbmsMtkGenerateDataV8Pckg
+				*tTMbmsMtkGenerateDataV8Pckg =reinterpret_cast<RMobilePhone::TMbmsMtkGenerateDataV8Pckg*> (aPckg1);
+
+		RMobilePhone::TMbmsMtkGenerateDataV8 &tTMbmsMtkGenerateDataV8= (*tTMbmsMtkGenerateDataV8Pckg) ();
+
+		if ( ((aAID == NULL) || (*aAID == iMBMSInfoList->At(index).iAID))
+				&& tTMbmsMtkGenerateDataV8.iMikey == iMBMSInfoList->At(index).iInputMikey)
+			{
+			TInt ret = iMBMSInfoList->At(index).iAuthErr;
+			if ( ret != KErrNone)
+				{
+				// return the Ks_Ext_NAF as NULL
+				tTMbmsMtkGenerateDataV8.iMtk = _L8 ("");
+				tTMbmsMtkGenerateDataV8.iSaltKey = _L8 ("");
+				if ( ret == KErrMMEtelScApplicationNotActive)
+					{
+					if ( !(iMBMSInfoList->At(index).iApplnActive == EFalse))
+						{
+						iPhone->ReqCompleted (aTsyReqHandle,KErrCorrupt);
+						index++;
+						return KErrNone;
+						}
+					}
+				}
+			else
+				{
+				tTMbmsMtkGenerateDataV8.iMtk = iMBMSInfoList->At(index).iMtk;
+				tTMbmsMtkGenerateDataV8.iSaltKey = iMBMSInfoList->At(index).iSaltkey;
+				}
+				iPhone->ReqCompleted (aTsyReqHandle, ret);
+			index++;
+			return KErrNone;
+			}
+
+		iPhone->ReqCompleted (aTsyReqHandle, KErrArgument);
+		index++;
+		return KErrNone;
+		}
+	else if ( authenticateData.ExtensionId ()== RMobilePhone::KETelMobileMbmsMskDeleteDataV8)
+		{
+		RMobilePhone::TMbmsMskDeleteDataV8Pckg
+				*tTMbmsMskDeleteDataV8Pckg =reinterpret_cast<RMobilePhone::TMbmsMskDeleteDataV8Pckg*> (aPckg1);
+
+		RMobilePhone::TMbmsMskDeleteDataV8 &tTMbmsMskDeleteDataV8= (*tTMbmsMskDeleteDataV8Pckg) ();
+
+		if ( ((aAID == NULL) || (*aAID == iMBMSInfoList->At(index).iAID))
+				&& tTMbmsMskDeleteDataV8.iMskIdKeyGroup == iMBMSInfoList->At(index).iMskIdGrp
+				&& tTMbmsMskDeleteDataV8.iKeyDomainId == iMBMSInfoList->At(index).iKeyDmn)
+			{
+			TInt ret = iMBMSInfoList->At(index).iAuthErr;
+			if ( ret != KErrNone)
+				{
+				if ( ret == KErrMMEtelScApplicationNotActive)
+					{
+					if ( !(iMBMSInfoList->At(index).iApplnActive == EFalse))
+						{
+						iPhone->ReqCompleted (aTsyReqHandle,KErrCorrupt);
+						index++;
+						return KErrNone;
+						}
+					}
+				}
+			else
+				{
+				// MSK IDs are successfully deleted from the EFs.
+				}
+				iPhone->ReqCompleted (aTsyReqHandle, ret);
+			index++;
+			return KErrNone;
+			}
+
+		iPhone->ReqCompleted (aTsyReqHandle, KErrArgument);
+		index++;
+		return KErrNone;
+		}
+	else if ( authenticateData.ExtensionId ()== RMobilePhone::KETelMobileMbmsMukDeleteDataV8)
+		{
+		RMobilePhone::TMbmsMukDeleteDataV8Pckg
+				*tTMbmsMukDeleteDataV8Pckg =reinterpret_cast<RMobilePhone::TMbmsMukDeleteDataV8Pckg*> (aPckg1);
+
+		RMobilePhone::TMbmsMukDeleteDataV8 &tTMbmsMukDeleteDataV8= (*tTMbmsMukDeleteDataV8Pckg) ();
+
+		if ( ((aAID == NULL) || (*aAID == iMBMSInfoList->At(index).iAID))
+				&& tTMbmsMukDeleteDataV8.iMukIdTlv == iMBMSInfoList->At(index).iMukIdTlv)
+			{
+			TInt ret = iMBMSInfoList->At(index).iAuthErr;
+			if ( ret != KErrNone)
+				{
+				if ( ret == KErrMMEtelScApplicationNotActive)
+					{
+					if ( !(iMBMSInfoList->At(index).iApplnActive == EFalse))
+						{
+						iPhone->ReqCompleted (aTsyReqHandle,KErrCorrupt);
+						index++;
+						return KErrNone;
+						}
+					}
+				}
+			else
+				{
+				// MUK IDs are successfully deleted from the EFs.
+				}
+				iPhone->ReqCompleted (aTsyReqHandle, ret);
+			index++;
+			return KErrNone;
+			}
+
+		iPhone->ReqCompleted (aTsyReqHandle, KErrArgument);
+		index++;
+		return KErrNone;
+		}
+	else
+		{
+		if(authenticateData.iCK==KConfigScWlan())
+			{
+			if(*aAID==KWlanAid())
+				{
+				if(authenticateData.iAUTN == KConfigScWlanAuthAUTN() && authenticateData.iRAND == KConfigScWlanAuthRAND())
+					{
+					authenticateData.iRES=KConfigScWlanAuthRES();
+					authenticateData.iIK=KConfigScWlanAuthIK();
+					authenticateData.iCK=KConfigScWlanAuthCK();
+					iPhone->ReqCompleted (aTsyReqHandle, KErrNone);
+					}
+				else if(authenticateData.iAUTN == KConfigScWlanAuthAUTN())
+					{
+					iPhone->ReqCompleted (aTsyReqHandle, KErrMMEtelSqnVerificationFailed);
+					}
+				else
+					{
+					iPhone->ReqCompleted (aTsyReqHandle, KErrMMEtelMacVerificationFailed);	
+					}
+				}
+			else
+				{
+				iPhone->ReqCompleted (aTsyReqHandle, KErrMMEtelScApplicationNotActive);	
+				}
+			}
+		else if(authenticateData.iCK==KConfigScWlanNotSupported())
+			{
+			iPhone->ReqCompleted (aTsyReqHandle, KErrNotSupported);	
+			}
+		else if ( authenticateData.iAUTN == _L8(""))
+			{
+			// Authenticate if EAP-SIM is being used.
+
+			// Find the iRAND value 
+			index = 0;
+			while ( (index < iAuthInfoList.Count()) && (authenticateData.iRAND != iAuthInfoList[index].iRAND))
+				{
+				index++;
+				}
+
+			if ( index == iAuthInfoList.Count ())
+				{
+				// The approriate iRAND value could not be found, so return KErrCorrupt.
+				iPhone->ReqCompleted (aTsyReqHandle, KErrCorrupt);
+				index++;
+				return KErrNone;
+				}
+			else
+				{
+				// Return the iRES and KC values that match the iRAND given, and blank everything else
+				authenticateData.iAUTS = _L8("");
+				authenticateData.iRES = iAuthInfoList[index].iRES;
+				authenticateData.iIK = _L8("");
+				authenticateData.iCK = _L8("");
+				authenticateData.iKc = iAuthInfoList[index].iKc;
+
+				iPhone->ReqCompleted (aTsyReqHandle, KErrNone);
+				}
+			}
+		else
+			{
+			for (index = 0; index < iAuthInfoList.Count (); index++)
+				{
+				// This is the USIM authorisation.
+				if ( authenticateData.iAUTN == iAuthInfoList[index].iAUTN &&authenticateData.iRAND == iAuthInfoList[index].iRAND &&((aAID == NULL) || (*aAID == iAuthInfoList[index].iAID)))
+					{
+					TInt ret = iAuthInfoList[index].iAuthErr;
+					if ( ret != KErrNone)
+						{
+						// Return the AUTS and blank everything else
+						authenticateData.iAUTS = iAuthInfoList[index].iAUTS;
+						authenticateData.iRES = _L8("");
+						authenticateData.iIK = _L8("");
+						authenticateData.iCK = _L8("");
+						authenticateData.iKc = _L8("");
+						}
+					else
+						{
+						authenticateData.iRES = iAuthInfoList[index].iRES;
+						authenticateData.iIK = iAuthInfoList[index].iIK;
+						authenticateData.iCK = iAuthInfoList[index].iCK;
+						authenticateData.iKc = iAuthInfoList[index].iKc;
+						}
+
+					iPhone->ReqCompleted (aTsyReqHandle, ret);
+					iAuthInfoList.Remove (index);
+					iAuthInfoList.Compress ();
+					index++;
+					return KErrNone;
+					}
+				iPhone->ReqCompleted (aTsyReqHandle, KErrCorrupt);	
+				}
+			}
+		}
+	index++;
+	return KErrNone;
+	}
+
+TInt CSimSmartCardAuth::GetScAuthenticationDataCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	LOGPHONE1("CSimSmartCardAuth::GetScAuthenticationDataCancel called");
+	iPhone->ReqCompleted(aTsyReqHandle, KErrCancel);
+	return KErrNone;
+	}
+
+const CTestConfigSection* CSimSmartCardAuth::CfgFile()
+	{
+	return iPhone->CfgFile();
+	}
+
+/**
+Parses the list of SmartCardAuthInfo tags from the config.txt file.
+*/
+void CSimSmartCardAuth::ParseAuthInfoL()
+	{
+	LOGPHONE1("CSimSmartCardAuth::ParseAuthInfoL called");
+
+	CTestConfigItem* item = NULL;
+
+	LOGPHONE1("Starting to Parse Smart Card Authentication Info");
+	TInt count = CfgFile()->ItemCount(KScAuthInfo);
+
+	TInt index;
+	for(index = 0; index < count; index++)
+		{
+		item = const_cast<CTestConfigItem*>(CfgFile()->Item(KScAuthInfo, index));
+		if(item == NULL)
+			{
+			break;
+			}
+		CleanupStack::PushL(item);
+
+		TInt ret = KErrNone, authErr = KErrNone;
+		TPtrC8 AUTN, RAND, RES, IK, CK, Kc, AUTS, appId;
+		TAuthInfo authInfo;
+		TInt dataFrmt;
+
+		//Get the data format
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 8, appId);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("appId",ret,8,&KScAuthInfo);
+			_LIT8(emptyAID, "");
+			appId.Set(emptyAID);
+			}
+		else
+			{
+			ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 9, dataFrmt);
+			if(ret != KErrNone)
+				{
+				LOGPARSERR("dataFrmt",ret,9,&KScAuthInfo);
+				}
+			else if (dataFrmt >= EMaxConfigDataFormat)
+				{
+				LOGPHONE1("WARNING IN CONFIGURATION FILE PARSING - Invalid format for SC Authenticate tag");
+				dataFrmt = EConfigDataFormatAscii;
+				}
+
+			authInfo.iAID.Copy(appId);
+
+			switch (dataFrmt)
+				{
+			case EConfigDataFormatMixedBinaryAndAscii:
+				ParseMixedBinaryAsciiDataL(authInfo.iAID);
+				break;
+			//case EConfigDataFormatAscii: // Do nothing
+			//default:
+				}
+			}
+
+		//Get the AUTN
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 0, AUTN);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("AUTN",ret,0,&KScAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iAUTN.Copy(AUTN);
+
+			switch (dataFrmt)
+				{
+			case EConfigDataFormatMixedBinaryAndAscii:
+				ParseMixedBinaryAsciiDataL(authInfo.iAUTN);
+				break;
+			//case EConfigDataFormatAscii: // Do nothing
+			//default:
+				}
+			}
+
+		//Get the RAND
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 1, RAND);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("RAND",ret,1,&KScAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iRAND.Copy(RAND);
+
+			switch (dataFrmt)
+				{
+			case EConfigDataFormatMixedBinaryAndAscii:
+				ParseMixedBinaryAsciiDataL(authInfo.iRAND);
+				break;
+			//case EConfigDataFormatAscii: // Do nothing
+			//default:
+				}
+			}
+
+		//Get the RES
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 2, RES);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("RES",ret,2,&KScAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iRES.Copy(RES);
+
+			switch (dataFrmt)
+				{
+			case EConfigDataFormatMixedBinaryAndAscii:
+				ParseMixedBinaryAsciiDataL(authInfo.iRES);
+				break;
+			//case EConfigDataFormatAscii: // Do nothing
+			//default:
+				}
+			}
+		
+		//Get the IK
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 3, IK);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("IK",ret,3,&KScAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iIK.Copy(IK);
+
+			switch (dataFrmt)
+				{
+			case EConfigDataFormatMixedBinaryAndAscii:
+				ParseMixedBinaryAsciiDataL(authInfo.iIK);
+				break;
+			//case EConfigDataFormatAscii: // Do nothing
+			//default:
+				}
+			}
+
+		//Get the CK
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 4, CK);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("CK",ret,4,&KScAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iCK.Copy(CK);
+
+			switch (dataFrmt)
+				{
+			case EConfigDataFormatMixedBinaryAndAscii:
+				ParseMixedBinaryAsciiDataL(authInfo.iCK);
+				break;
+			//case EConfigDataFormatAscii: // Do nothing
+			//default:
+				}
+			}
+
+		//Get the CK
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 5, Kc);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("Kc",ret,5,&KScAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iKc.Copy(Kc);
+
+			switch (dataFrmt)
+				{
+			case EConfigDataFormatMixedBinaryAndAscii:
+				ParseMixedBinaryAsciiDataL(authInfo.iKc);
+				break;
+			//case EConfigDataFormatAscii: // Do nothing
+			//default:
+				}
+			}
+
+		//Get the AUTS
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 6, AUTS);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("AUTS",ret,6,&KScAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iAUTS.Copy(AUTS);
+
+			switch (dataFrmt)
+				{
+			case EConfigDataFormatMixedBinaryAndAscii:
+				ParseMixedBinaryAsciiDataL(authInfo.iAUTS);
+				break;
+			//case EConfigDataFormatAscii: // Do nothing
+			//default:
+				}
+			}
+
+		//Get authentication error
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 7, authErr);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("authErr",ret,7,&KScAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iAuthErr = authErr;
+			}
+
+		iAuthInfoList.Append(authInfo);
+		CleanupStack::Pop(item);
+		} // end FOR Loop
+	}
+
+/**
+Parses the list of GBAAuthInfo tags from the config.txt file.
+*/
+void CSimSmartCardAuth::ParseGBAAuthInfoL()
+	{
+	LOGPHONE1("CSimSmartCardAuth::ParseGBAAuthInfoL called");
+
+	CTestConfigItem* item = NULL;
+
+	LOGPHONE1("Starting to Parse GBA Authentication Info");
+	TInt count = CfgFile()->ItemCount(KGBAAuthInfo);
+
+	TInt index;
+	for(index = 0; index < count; index++)
+		{
+		item = const_cast<CTestConfigItem*>(CfgFile()->Item(KGBAAuthInfo, index));
+		if(item == NULL)
+			{
+			break;
+			}
+		CleanupStack::PushL(item);
+
+		TInt ret = KErrNone, authErr = KErrNone;
+		TPtrC8 AUTN, RAND, appId, RES, AUTS, NAFID,IMPI, KSExtNaf, BtID, KeyLifeTime ;
+		TBool OtherApplnBusy, applnActive;
+		TGBAAuthInfo authInfo;
+		
+
+		//Get the AUTN
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 0, AUTN);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("AUTN",ret,0,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iAUTN.Copy(AUTN);
+			}
+
+		//Get the RAND
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 1, RAND);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("RAND",ret,1,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iRAND.Copy(RAND);
+			}
+
+		//Get the APPID
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 2, appId);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("APPID",ret,2,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iAID.Copy(appId);
+			}
+		
+		//Get the RES
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 3, RES);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("RES",ret,3,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iRES.Copy(RES);
+			}
+		
+		//Get the AUTS
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 4, AUTS);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("AUTS",ret,4,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iAUTS.Copy(AUTS);
+			}
+		
+		//Get the NAFID
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 5, NAFID);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("NAFID",ret,5,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iNAFID.Copy(NAFID);
+			}
+		
+		//Get the IMPI
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 6, IMPI);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("IMPI",ret,6,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iIMPI.Copy(IMPI);
+			}
+		
+		//Get the KsExtNaf
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 7, KSExtNaf);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("KSExtNaf",ret,7,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iKsExtNaf.Copy(KSExtNaf);
+			}
+		
+		//Get the BtID
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 8, BtID);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("BtID",ret,8,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iBtid.Copy(BtID);
+			}
+		
+		//Get the KeyLifeTime
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 9, KeyLifeTime);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("KeyLifeTime",ret,9,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iKeyLifeTime.Copy(KeyLifeTime);
+			}
+
+		//Get the OtherApplnBusy
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 10, OtherApplnBusy);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("OtherApplnBusy",ret,10,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iOtherApplnBusy = OtherApplnBusy;
+			}
+
+		//Get the CurrentApplnActive
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 11, applnActive);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("applnActive",ret,11,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iApplnActive = applnActive;
+			}
+
+		//Get authentication error
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 12, authErr);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("authErr",ret,12,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iAuthErr = authErr;
+			}
+
+		iGBAAuthInfoList->AppendL(authInfo);
+		CleanupStack::Pop(item);
+		} // end FOR Loop
+	}
+
+/**
+ Parses the list of MBMSAuthInfo tags from the config.txt file.
+*/
+void CSimSmartCardAuth::ParseMBMSAuthInfoL()
+	{
+	LOGPHONE1 ("CSimSmartCardAuth::ParseMBMSAuthInfoL called");
+
+	CTestConfigItem* item = NULL;
+
+	LOGPHONE1 ("Starting to Parse MBMS Authentication Info");
+
+	TInt count = CfgFile()->ItemCount (KMBMSInfo);
+	TMBMSInfo tMbmsInfo;
+
+	for (TInt index = 0; index < count; index++)
+		{
+		item = const_cast<CTestConfigItem*>(CfgFile()->Item(KMBMSInfo, index));
+		if ( item == NULL)
+			{
+			break;
+			}
+		CleanupStack::PushL (item);
+
+		TInt ret = KErrNone;
+		TPtrC8 iMikey, oMikey, mtk, saltKey, keyDmn, MskIdgrp;
+		TPtrC8 MukId, MukIdi, MukIdr, MukTimeStamp, appId, KSIntNaf;
+		TBool applnActive;
+		TInt authErr;
+
+		//Get the input Mikey
+		ret = CTestConfig::GetElement (item->Value (), KStdDelimiter, 0, iMikey);
+		if ( ret != KErrNone)
+			{
+			LOGPARSERR ("iMikey", ret, 0, &KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iInputMikey.Copy (iMikey);
+			}
+
+		//Get the output Mikey
+		ret = CTestConfig::GetElement (item->Value (), KStdDelimiter, 1, oMikey);
+		if ( ret != KErrNone)
+			{
+			LOGPARSERR ("oMikey", ret, 1, &KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iOutputMikey.Copy (oMikey);
+			}
+
+		//Get the MTK
+		ret = CTestConfig::GetElement (item->Value (), KStdDelimiter, 2, mtk);
+		if ( ret != KErrNone)
+			{
+			LOGPARSERR ("MTK", ret, 2, &KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iMtk.Copy (mtk);
+			}
+
+		//Get the SaltKey
+		ret = CTestConfig::GetElement (item->Value (), KStdDelimiter, 3,
+				saltKey);
+		if ( ret != KErrNone)
+			{
+			LOGPARSERR ("saltKey", ret, 3, &KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iSaltkey.Copy (saltKey);
+			}
+
+		//Get the KeyDomain
+		ret = CTestConfig::GetElement (item->Value (), KStdDelimiter, 4, keyDmn);
+		if ( ret != KErrNone)
+			{
+			LOGPARSERR ("keyDmn ", ret, 4, &KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iKeyDmn.Copy (keyDmn);
+			}
+
+		//Get the MskIdgrp
+		ret = CTestConfig::GetElement (item->Value (), KStdDelimiter, 5,
+				MskIdgrp);
+		if ( ret != KErrNone)
+			{
+			LOGPARSERR ("MskIdgrp", ret, 5, &KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iMskIdGrp.Copy (MskIdgrp);
+			}
+
+		//Get the iMukIdTlv
+		ret = CTestConfig::GetElement (item->Value (), KStdDelimiter, 6, MukId);
+		if ( ret != KErrNone)
+			{
+			LOGPARSERR ("MukId ", ret, 6, &KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iMukIdTlv.Copy (MukId);
+			}
+
+		//Get the MukIdi
+		ret = CTestConfig::GetElement (item->Value (), KStdDelimiter, 7, MukIdi);
+		if ( ret != KErrNone)
+			{
+			LOGPARSERR ("MukIdi", ret, 7, &KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iMukIdi.Copy (MukIdi);
+			}
+
+		//Get the MukIdr 
+		ret = CTestConfig::GetElement (item->Value (), KStdDelimiter, 8, MukIdr);
+		if ( ret != KErrNone)
+			{
+			LOGPARSERR ("MukIdr ", ret, 8, &KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iMukIdr.Copy (MukIdr);
+			}
+
+		//Get the MukTimeStamp
+		ret = CTestConfig::GetElement (item->Value (), KStdDelimiter, 9,MukTimeStamp);
+		if ( ret != KErrNone)
+			{
+			LOGPARSERR ("iMikey", ret, 9, &KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iMukTimestamp.Copy (MukTimeStamp);
+			}
+
+		//Get the APPID
+		ret = CTestConfig::GetElement (item->Value (), KStdDelimiter, 10, appId);
+		if ( ret != KErrNone)
+			{
+			LOGPARSERR ("APPID", ret, 10, &KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iAID.Copy (appId);
+			}
+
+		//Get the KsIntNaf
+		ret = CTestConfig::GetElement (item->Value (), KStdDelimiter, 11,KSIntNaf);
+		if ( ret != KErrNone)
+			{
+			LOGPARSERR ("KSIntNaf", ret, 11, &KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iKsIntNaf.Copy (KSIntNaf);
+			}
+
+		//Get the CurrentApplnActive
+		ret = CTestConfig::GetElement (item->Value (), KStdDelimiter, 12,applnActive);
+		if ( ret != KErrNone)
+			{
+			LOGPARSERR ("applnActive", ret, 12, &KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iApplnActive = applnActive;
+			}
+
+		//Get authentication error
+		ret = CTestConfig::GetElement (item->Value (), KStdDelimiter, 13,authErr);
+		if ( ret != KErrNone)
+			{
+			LOGPARSERR ("authErr", ret, 13, &KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iAuthErr = authErr;
+			}
+		
+		iMBMSInfoList->AppendL(tMbmsInfo);
+		CleanupStack::Pop (item);
+		}
+	}
+	
+
+
+