diff -r 6b1d113cdff3 -r 6638e7f4bd8f telephonyserverplugins/simtsy/src/csimsmartcardauth.cpp --- a/telephonyserverplugins/simtsy/src/csimsmartcardauth.cpp Mon May 03 13:37:20 2010 +0300 +++ b/telephonyserverplugins/simtsy/src/csimsmartcardauth.cpp Thu May 06 15:10:38 2010 +0100 @@ -1,1072 +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 -#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 (1); - iMBMSInfoList = new (ELeave) CArrayFixFlat (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(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 (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(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 (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 (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 (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 (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(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(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(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); - } - } - - - - +// 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 +#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 (1); + iMBMSInfoList = new (ELeave) CArrayFixFlat (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(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 (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(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 (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 (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 (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 (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(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(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(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); + } + } + + + +