--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/simtsy/src/CSimPhoneIMSAuth.cpp Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,580 @@
+// Copyright (c) 2005-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:
+// Implements the Phone IMS Authorization/Authentication code.
+//
+//
+
+/**
+ @file
+*/
+
+#include <testconfigfileparser.h>
+#include <etelmmerr.h>
+#include "CSimPhone.h"
+#include "Simlog.h"
+
+//
+// CSimPhoneIMSAuth
+//
+
+CSimPhoneIMSAuth* CSimPhoneIMSAuth::NewL(CSimPhone* aPhone)
+/**
+ * Standard two phase constructor.
+ * @param aPhone The phone object from which the Phone Smart Card applications will open
+ */
+ {
+ CSimPhoneIMSAuth* obj=new(ELeave) CSimPhoneIMSAuth(aPhone);
+ CleanupStack::PushL(obj);
+ obj->ConstructL();
+ CleanupStack::Pop();
+ return obj;
+ }
+
+CSimPhoneIMSAuth::CSimPhoneIMSAuth(CSimPhone* aPhone)
+ : iPhone(aPhone)
+/**
+ * Trivial first phase constructor.
+ * @param aPhone The phone object from which this Phone SmartCard App was opened.
+ */
+ {}
+
+
+void CSimPhoneIMSAuth::ConstructL()
+/**
+* Second phase of the 2-phase constructor.
+* Constructs all the member data and retrieves all the data from the config file specific to this class.
+*
+* @leave Leaves due to not enough memory or if any data member does not construct for any reason.
+*/
+ {
+ iTimer=CSimTimer::NewL(iPhone);
+ iGetAuthorizationData = new CArrayPtrFlat<CListReadAllAttempt>(1);
+ LOGPHONE1("Starting to parse Phone IMS Authorization/Authentication config params...");
+ ParseAuthorizationInfoL();
+ ParseAuthenticationInfoL();
+ LOGPHONE1("Finished parsing Phone IMS Authorization/Authentication config params...");
+ }
+
+
+CSimPhoneIMSAuth::~CSimPhoneIMSAuth()
+/**
+ * Standard destructor. Any objects created by the ::ConstructL() function
+ * will be destroyed here.
+ */
+ {
+ delete iTimer;
+ if(iGetAuthorizationData)
+ {
+ iGetAuthorizationData->ResetAndDestroy();
+ }
+ delete iGetAuthorizationData;
+
+ TInt authInfoCount = iAuthorizationInfoList.Count();
+ TInt ii;
+ for(ii = 0; ii < authInfoCount; ii++)
+ {
+ iAuthorizationInfoList[ii].iIMPUArray.Close();
+ }
+ iAuthorizationInfoList.Close();
+
+ iAuthenticationInfoList.Close();
+
+ //RAJ TODO
+ }
+
+
+const CTestConfigSection* CSimPhoneIMSAuth::CfgFile()
+/**
+* Returns a pointer to the config file section
+*
+* @return CTestConfigSection a pointer to the configuration file data section
+*/
+ {
+ LOGPHONE1(">>CSimPhoneIMSAuth::CfgFile");
+ return iPhone->CfgFile();
+ }
+
+void CSimPhoneIMSAuth::TimerCallBack(TInt /*aId*/)
+/**
+* Timer callback function. When the timer goes off, it will call back into this
+* function for further processing.
+*
+* @param aId an id identifying which timer callback is being called
+*/
+ {
+ iTimerStarted = EFalse;
+ iCurrentAuthorizationInfo++;
+ if(iAuthInfoChangeNotifyPending)
+ {
+ iAuthInfoChangeNotifyPending = EFalse;
+ iPhone->ReqCompleted(iAuthInfoChangeNotifyReqHandle, KErrNone);
+ }
+ }
+
+void CSimPhoneIMSAuth::ParseAuthorizationInfoL()
+/**
+* Parses the list of Authorization Info tags from the Config file
+*
+*/
+ {
+ const CTestConfigItem* item=NULL;
+ TInt ret=KErrNone;
+ TPtrC8 IMPI, IMPUValue, HNDN;
+ TInt IMPUCount, authorizationDataSource, infoChangeDelay;
+ TAuthorizationInfo authorizationInfo;
+
+ LOGPHONE1("Starting to Parse IMS Authorization Info");
+ TInt count = CfgFile()->ItemCount(KAuthorizationInfo);
+
+ TInt index;
+ for(index=0;index<count;index++)
+ {
+ item=CfgFile()->Item(KAuthorizationInfo,index);
+ TInt delimiterNum = 0;
+ if(!item)
+ {
+ break;
+ }
+
+ //Get the IMPI
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,delimiterNum,IMPI);
+ if(ret!=KErrNone)
+ {
+ LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHORIZATION INFO TAG");
+ continue;
+ }
+ else
+ {
+ authorizationInfo.iIMPI.Copy(IMPI);
+ delimiterNum++;
+ }
+
+ //Get number of elements in the IMPU Array
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,delimiterNum,IMPUCount);
+ if(ret!=KErrNone)
+ {
+ LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHORIZATION INFO TAG");
+ continue;
+ }
+ else
+ {
+ delimiterNum++;
+ RArray<RMobilePhone::TIMPU> IMPUArray;
+ TBool IMPUError = EFalse;
+
+ //Get the IMPU values
+ TInt ii;
+ for(ii = 0;ii < IMPUCount; ii++)
+ {
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,delimiterNum,IMPUValue);
+ if(ret!=KErrNone)
+ {
+ LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHORIZATION INFO TAG");
+ IMPUError = ETrue;
+ break;
+ }
+ else
+ {
+ IMPUArray.Append(IMPUValue);
+ delimiterNum++;
+ }
+ }
+
+ if(IMPUError)
+ {
+ LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHORIZATION INFO TAG");
+ continue;
+ }
+ else
+ {
+ authorizationInfo.iIMPUArray = IMPUArray;
+ }
+ }
+
+ //Get the HNDN
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,delimiterNum,HNDN);
+ if(ret!=KErrNone)
+ {
+ LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHORIZATION INFO TAG");
+ continue;
+ }
+ else
+ {
+ authorizationInfo.iHomeNetworkDomainName.Copy(HNDN);
+ delimiterNum++;
+ }
+
+ //Get the Authorization Data Source
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,delimiterNum,authorizationDataSource);
+ if(ret!=KErrNone)
+ {
+ LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHORIZATION INFO TAG");
+ continue;
+ }
+ else
+ {
+ authorizationInfo.iAuthenticationDataSource =
+ static_cast<RMobilePhone::TAuthorizationDataSource>(authorizationDataSource);
+
+ delimiterNum++;
+ }
+
+ //Get the Authorization Info change delay
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,delimiterNum,infoChangeDelay);
+ if(ret!=KErrNone)
+ {
+ LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHORIZATION INFO TAG");
+ continue;
+ }
+ else
+ {
+ authorizationInfo.iInfoChangeDelay = infoChangeDelay;
+ }
+
+ iAuthorizationInfoList.Append(authorizationInfo);
+ }//end FOR Loop
+ iCurrentAuthorizationInfo = 0;
+ }
+
+void CSimPhoneIMSAuth::ParseAuthenticationInfoL()
+/**
+* Parses the list of Authentication Info tags from the Config file
+*
+*/
+ {
+ const CTestConfigItem* item=NULL;
+ TInt ret=KErrNone;
+ TPtrC8 AUTN, RAND, RES, IK, CK, AUTS;
+ TInt authErr;
+ TAuthenticationInfo authenticationInfo;
+
+ LOGPHONE1("Starting to Parse IMS Authentication Info");
+ TInt count = CfgFile()->ItemCount(KAuthenticationInfo);
+
+ TInt index;
+ for(index=0; index<count; index++)
+ {
+ item=CfgFile()->Item(KAuthenticationInfo,index);
+ if(!item)
+ {
+ break;
+ }
+
+ //Get the AUTN
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,AUTN);
+ if(ret!=KErrNone)
+ {
+ LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHENTICATION INFO TAG");
+ continue;
+ }
+ else
+ {
+ authenticationInfo.iAUTN.Copy(AUTN);
+ }
+
+ //Get the RAND
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,RAND);
+ if(ret!=KErrNone)
+ {
+ LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHENTICATION INFO TAG");
+ continue;
+ }
+ else
+ {
+ authenticationInfo.iRAND.Copy(RAND);
+ }
+
+ //Get the RES
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,RES);
+ if(ret!=KErrNone)
+ {
+ LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHENTICATION INFO TAG");
+ continue;
+ }
+ else
+ {
+ authenticationInfo.iRES.Copy(RES);
+ }
+
+ //Get the IK
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,IK);
+ if(ret!=KErrNone)
+ {
+ LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHENTICATION INFO TAG");
+ continue;
+ }
+ else
+ {
+ authenticationInfo.iIK.Copy(IK);
+ }
+
+ //Get the CK
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,CK);
+ if(ret!=KErrNone)
+ {
+ LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHENTICATION INFO TAG");
+ continue;
+ }
+ else
+ {
+ authenticationInfo.iCK.Copy(CK);
+ }
+
+ //Get the AUTS
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,AUTS);
+ if(ret!=KErrNone)
+ {
+ LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHENTICATION INFO TAG");
+ continue;
+ }
+ else
+ {
+ authenticationInfo.iAUTS.Copy(AUTS);
+ }
+
+ //Get authentication error
+ ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,authErr);
+ if(ret!=KErrNone)
+ {
+ LOGPHONE1("ERROR IN CONFIGURATION FILE PARSING: BAD AUTHENTICATION INFO TAG");
+ continue;
+ }
+ else
+ {
+ authenticationInfo.iAuthenticationErr = authErr;
+ }
+
+ iAuthenticationInfoList.Append(authenticationInfo);
+ }//end FOR Loop
+ }
+
+TInt CSimPhoneIMSAuth::GetAuthorizationInfoPhase1(const TTsyReqHandle aTsyReqHandle,
+ RMobilePhone::TClientId* aClientId,TInt* aBufSize)
+ {
+ LOGPHONE1("CSimPhoneIMSAuth::GetAuthorizationInfoPhase1 called");
+ TInt ret(KErrNone);
+ TInt leaveCode(KErrNone);
+ TRAP(leaveCode, ret=ProcessGetAuthorizationInfoPhase1L(aTsyReqHandle, aClientId, aBufSize););
+ if (leaveCode != KErrNone)
+ {
+ iPhone->ReqCompleted(aTsyReqHandle,leaveCode);
+ }
+
+ return ret;
+ }
+
+
+TInt CSimPhoneIMSAuth::ProcessGetAuthorizationInfoPhase1L(const TTsyReqHandle aTsyReqHandle,
+ RMobilePhone::TClientId* aClientId, TInt* aBufSize)
+ {
+ LOGPHONE1("CSimPhoneIMSAuth::GetAuthorizationInfoPhase1 called");
+
+ // Store the streamed list and the client ID
+ CListReadAllAttempt* read=CListReadAllAttempt::NewL(*aClientId,aTsyReqHandle);
+ CleanupStack::PushL(read);
+
+ RMobilePhone::CImsAuthorizationInfoV5* iAuthInfo = RMobilePhone::CImsAuthorizationInfoV5::NewL();
+ CleanupStack::PushL(iAuthInfo);
+
+ // Check that the data structure is supported by the simulated TSY version
+ TInt err = iPhone->CheckSimTsyVersion(*iAuthInfo);
+ if(err != KErrNone)
+ {
+ iPhone->ReqCompleted(aTsyReqHandle, err);
+ CleanupStack::PopAndDestroy(2, read); // iAuthInfo, read
+ return KErrNone;
+ }
+
+ iAuthInfo->iIMPI = iAuthorizationInfoList[iCurrentAuthorizationInfo].iIMPI;
+
+ TInt IMPUCount = iAuthorizationInfoList[iCurrentAuthorizationInfo].iIMPUArray.Count();
+ TInt index;
+ for(index = 0; index < IMPUCount; index++)
+ {
+ iAuthInfo->iIMPUArray.Append(iAuthorizationInfoList[iCurrentAuthorizationInfo].iIMPUArray[index]);
+ }
+
+ iAuthInfo->iHomeNetworkDomainName =
+ iAuthorizationInfoList[iCurrentAuthorizationInfo].iHomeNetworkDomainName;
+ iAuthInfo->iAuthenticationDataSource =
+ iAuthorizationInfoList[iCurrentAuthorizationInfo].iAuthenticationDataSource;
+
+ HBufC8* iBuff=NULL;
+ iAuthInfo->ExternalizeL(iBuff);
+ CleanupStack::PopAndDestroy(iAuthInfo);
+ CleanupDeletePushL(iBuff);
+
+ CBufFlat* buf=CBufFlat::NewL(iBuff->Length());
+ CleanupStack::PushL(buf);
+ buf->InsertL(0,*iBuff);
+
+ read->iListBuf = buf;
+ CleanupStack::Pop(buf);
+ CleanupStack::PopAndDestroy(iBuff);
+
+ iGetAuthorizationData->AppendL(read);
+ CleanupStack::Pop(read);
+
+ // return the CBufBase’s size to client
+ *aBufSize=(read->iListBuf)->Size();
+
+ // Complete first phase of list retrieval
+ iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+ return KErrNone;
+
+ }
+
+
+TInt CSimPhoneIMSAuth::GetAuthorizationInfoPhase2(const TTsyReqHandle aTsyReqHandle,
+ RMobilePhone::TClientId* aClientId, TDes8* aBuffer)
+ {
+ LOGPHONE1("CSimPhoneIMSAuth::GetAuthorizationInfoPhase2 called");
+ CListReadAllAttempt* read=NULL;
+
+ // Find the get Authorization Info attempt from this client
+ TInt index;
+ for (index = 0; index < iGetAuthorizationData->Count(); index++)
+ {
+ read = iGetAuthorizationData->At(index);
+ if ((read->iClient.iSessionHandle==aClientId->iSessionHandle) &&
+ (read->iClient.iSubSessionHandle==aClientId->iSubSessionHandle))
+ {
+ TPtr8 bufPtr((read->iListBuf)->Ptr(0));
+ // Copy the streamed list to the client
+ aBuffer->Copy(bufPtr);
+ delete read;
+ iGetAuthorizationData->Delete(index);
+ iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+ return KErrNone;
+ }
+ }
+ iPhone->ReqCompleted(aTsyReqHandle,KErrBadHandle);
+ return KErrNone;
+ }
+
+
+TInt CSimPhoneIMSAuth::GetAuthorizationInfoCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGPHONE1("CSimPhoneIMSAuth::GetAuthorizationInfoCancel called");
+
+ // Remove the read all attempt from iGetAuthorizationData
+ CListReadAllAttempt* read=NULL;
+ TInt index;
+ for (index = 0; index <iGetAuthorizationData->Count(); index++)
+ {
+ read = iGetAuthorizationData->At(index);
+ if (read->iReqHandle == aTsyReqHandle)
+ {
+ delete read;
+ iGetAuthorizationData->Delete(index);
+ break;
+ }
+ }
+
+ iPhone->ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+
+TInt CSimPhoneIMSAuth::NotifyImsAuthorizationInfoChanged(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGPHONE1("CSimPhoneIMSAuth::NotifyImsAuthorizationInfoChanged called");
+ __ASSERT_ALWAYS(!iAuthInfoChangeNotifyPending,SimPanic(ENotificationReqAlreadyOutstanding));
+
+ TInt count=iAuthorizationInfoList.Count();
+ if(iCurrentAuthorizationInfo < count)
+ {
+ iTimer->Start(iAuthorizationInfoList[iCurrentAuthorizationInfo].iInfoChangeDelay,this);
+ iTimerStarted = ETrue;
+ }
+
+ iAuthInfoChangeNotifyPending=ETrue;
+ iAuthInfoChangeNotifyReqHandle = aTsyReqHandle;
+
+ return KErrNone;
+ }
+
+
+TInt CSimPhoneIMSAuth::NotifyImsAuthorizationInfoChangedCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGPHONE1("CSimPhoneIMSAuth::NotifyImsAuthorizationInfoChangedCancel called");
+ if(iAuthInfoChangeNotifyPending)
+ {
+ if(iTimerStarted)
+ {
+ iTimer->Cancel();
+ }
+
+ iAuthInfoChangeNotifyPending=EFalse;
+ iPhone->ReqCompleted(aTsyReqHandle, KErrCancel);
+ }
+
+ return KErrNone;
+ }
+
+
+TInt CSimPhoneIMSAuth::GetAuthenticationData(const TTsyReqHandle aTsyReqHandle,TDes8* aAuthenticationData)
+ {
+ LOGPHONE1("CSimPhoneIMSAuth::AuthentificationData called");
+
+ RMobilePhone::TImsAuthenticateDataV5Pckg* authenticateDataPckgd =
+ (RMobilePhone::TImsAuthenticateDataV5Pckg*)aAuthenticationData;
+ RMobilePhone::TImsAuthenticateDataV5& 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;
+ }
+
+ TInt index;
+ for(index = 0; index < iAuthenticationInfoList.Count(); index++)
+ {
+ if(authenticateData.iAUTN == iAuthenticationInfoList[index].iAUTN &&
+ authenticateData.iRAND == iAuthenticationInfoList[index].iRAND)
+ {
+ TInt ret = iAuthenticationInfoList[index].iAuthenticationErr;
+ if(ret != KErrNone)
+ {
+ //return the AUTS and blank everything else
+ authenticateData.iAUTS = iAuthenticationInfoList[index].iAUTS;
+ authenticateData.iRES = _L8("");
+ authenticateData.iIK = _L8("");
+ authenticateData.iCK = _L8("");
+ }
+ else
+ {
+ authenticateData.iRES = iAuthenticationInfoList[index].iRES;
+ authenticateData.iIK = iAuthenticationInfoList[index].iIK;
+ authenticateData.iCK = iAuthenticationInfoList[index].iCK;
+ }
+
+ iPhone->ReqCompleted(aTsyReqHandle, ret);
+ return KErrNone;
+ }
+ }
+
+ iPhone->ReqCompleted(aTsyReqHandle, KErrCorrupt);
+ return KErrNone;
+ }
+
+
+TInt CSimPhoneIMSAuth::GetAuthenticationDataCancel(const TTsyReqHandle aTsyReqHandle)
+ {
+ LOGPHONE1("CSimPhoneIMSAuth::AuthentificationDatCancel called");
+ iPhone->ReqCompleted(aTsyReqHandle, KErrCancel);
+ return KErrNone;
+ }