// 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);
}
}