/***************************************************************************** Function Name : IMSA_RegProcImsMsgAuth() Description : IMS鉴权消息处理 Input : CSM_OutputService* pstCsmOutputService Output : VOS_VOID Return Value : VOS_VOID History : 1.sunbing 49683 2013-07-01 Draft Enact *****************************************************************************/ VOS_VOID IMSA_RegProcImsMsgAuth(IMSA_IMS_OUTPUT_SERVICE_EVENT_STRU* pstOutputService) { USIMM_AUTH_DATA_STRU stUsimAuthData ={0}; if(pstOutputService->bitOpAka == 0) { IMSA_WARN_LOG("IMSA_RegProcImsMsgAuth: AKA bit is empty!"); return; } /*保存IMS消息对应的OPID*/ IMSA_SaveRcvImsOpid(pstOutputService->ulOpId); stUsimAuthData.enAuthType = USIMM_IMS_AUTH; stUsimAuthData.unAuthPara.stImsAuth.stAutn.ulDataLen = 16; stUsimAuthData.unAuthPara.stImsAuth.stAutn.pucData = (VOS_UINT8*)&pstOutputService->stAkaPara.ucAkaAutn[0]; stUsimAuthData.unAuthPara.stImsAuth.stRand.ulDataLen = 16; stUsimAuthData.unAuthPara.stImsAuth.stRand.pucData = (VOS_UINT8*)&pstOutputService->stAkaPara.ucAkaRand[0]; /*输入鉴权数据*/ (VOS_VOID)USIMM_AuthReq(PS_PID_IMSA, \ USIMM_ISIM_APP,\ &stUsimAuthData); }
/***************************************************************************** Function Name : IMSA_RegProcImsMsgAuth() Description : IMS鉴权消息处理 Input : CSM_OutputService* pstCsmOutputService Output : VOS_VOID Return Value : VOS_VOID History : 1.sunbing 49683 2013-07-01 Draft Enact *****************************************************************************/ VOS_VOID IMSA_RegProcImsMsgAuth(IMSA_IMS_OUTPUT_SERVICE_EVENT_STRU* pstOutputService) { USIMM_AUTH_DATA_STRU stUsimAuthData ={0}; VOS_UINT8 ucOpId; if(pstOutputService->bitOpAka == 0) { IMSA_WARN_LOG("IMSA_RegProcImsMsgAuth: AKA bit is empty!"); return; } /*保存IMS消息对应的OPID*/ /* 如果IMS上报的是紧急类型的鉴权请求,则将OPID保存在紧急全局变量中 */ ucOpId = IMSA_AllocUsimOpId(); if (IMSA_TRUE == pstOutputService->ulIsEmergency) { IMSA_SaveRcvImsEmcOpid(pstOutputService->ulOpId); IMSA_SetUsimEmcOpid(ucOpId); stUsimAuthData.ucOpId = IMSA_GetUsimEmcOpid(); } else { IMSA_SaveRcvImsNormOpid(pstOutputService->ulOpId); IMSA_SetUsimNormOpid(ucOpId); stUsimAuthData.ucOpId = IMSA_GetUsimNormOpid(); } stUsimAuthData.enAuthType = USIMM_IMS_AUTH; stUsimAuthData.unAuthPara.stImsAuth.stAutn.ulDataLen = 16; stUsimAuthData.unAuthPara.stImsAuth.stAutn.pucData = (VOS_UINT8*)&pstOutputService->stAkaPara.ucAkaAutn[0]; stUsimAuthData.unAuthPara.stImsAuth.stRand.ulDataLen = 16; stUsimAuthData.unAuthPara.stImsAuth.stRand.pucData = (VOS_UINT8*)&pstOutputService->stAkaPara.ucAkaRand[0]; /*输入鉴权数据*/ (VOS_VOID)USIMM_AuthReq(PS_PID_IMSA, \ USIMM_ISIM_APP,\ &stUsimAuthData); }
VOS_UINT32 USIMM_AuthReq_Instance( MODEM_ID_ENUM_UINT16 enModemID, VOS_UINT32 ulSenderPid, USIMM_APP_TYPE_ENUM_UINT32 enAppType, USIMM_AUTH_DATA_STRU *pstAuth) { if (MODEM_ID_0 == enModemID) { USIMM_NORMAL_LOG("USIMM_AuthReq_Instance: call USIMM_AuthReq"); return USIMM_AuthReq(ulSenderPid, enAppType, pstAuth); } #if (FEATURE_MULTI_MODEM == FEATURE_ON) if (MODEM_ID_1 == enModemID) { return I1_USIMM_AuthReq(ulSenderPid, enAppType, pstAuth); } #endif USIMM_ERROR_LOG("USIMM_AuthReq_Instance: Para Is Error"); return USIMM_API_WRONG_PARA; }
VOS_UINT32 NAS_EMM_MsAnyStateSsAnyStateMsgCnAuthReq( VOS_UINT32 ulMsgId, VOS_VOID *pMsg ) { NAS_EMM_AUTH_REQ_STRU *pstAuthReq = VOS_NULL_PTR; /*NAS_EMM_USIM_PARAM_STRU stAuthVector;*/ VOS_UINT32 ulHardUsimAuthRslt; VOS_UINT8 ucSepBitInAMF; VOS_UINT8 ucKsiAuthReq = 0; USIMM_AUTH_DATA_STRU stAuth={0}; (VOS_VOID)ulMsgId; NAS_EMM_SECU_LOG_INFO("NAS_EMM_MsAnyStateSsAnyStateMsgCnAuthReq entered!"); pstAuthReq = (NAS_EMM_AUTH_REQ_STRU *)pMsg; /* lihong00150010 emergency tau&service begin */ if ((NAS_LMM_SIM_STATUS_UNAVAILABLE == NAS_LMM_GetSimState()) || (NAS_LMM_SIM_INVALID == NAS_LMM_GetPsSimValidity())) { NAS_EMM_SECU_LOG_WARN("NAS_EMM_MsAnyStateSsAnyStateMsgCnAuthReq: no USIM"); return NAS_LMM_MSG_HANDLED; } /* lihong00150010 emergency tau&service end */ /* 判断AUTH REQ消息中AMF携带的 Separation BIT,是否 For E_UTRAN*/ ucSepBitInAMF = ((pstAuthReq->aucAutn[NAS_EMM_AUTH_AMF_IN_AUTN_POS])&0x80) >> 7; if(NAS_EMM_AUTH_FOR_EUTRAN != ucSepBitInAMF) { NAS_EMM_SECU_LOG1_NORM("NAS_EMM_MsAnyStateSsAnyStateMsgCnAuthReq: ERR. AMF Separation BIT = ", ucSepBitInAMF); NAS_EMM_UsimAuthFail(NAS_EMM_AUTH_NON_EPS_AUTH_UNACCEPTABLE); return NAS_LMM_MSG_HANDLED; } /* 判断当前随机值是否有效,如果有效,判断AUTH REQ消息携带的 RAND与本次保存的 RAND,如果相同,直接回复AUTH RSP*/ if((NAS_EMM_BIT_SLCT == NAS_EMM_GetSecuAuthOpRand()) &&(NAS_EMM_SECU_MEM_CMP_EQUAL == NAS_LMM_MEM_CMP(pstAuthReq->aucRand, NAS_EMM_GetSecuAuthRandAddr(), NAS_EMM_SECU_AUTH_RAND_LEN))) { NAS_EMM_SECU_LOG_INFO("NAS_EMM_MsAnyStateSsAnyStateMsgCnAuthReq: New Rand == Old Rand!"); NAS_EMM_SendAuthRsp(); return NAS_LMM_MSG_HANDLED; } /* AUTH REQ消息携带的Ksi不能与当前安全上下文的Ksi相同*/ ucKsiAuthReq = pstAuthReq->ucKsi & NAS_EMM_LOW_HALF_BYTE_F; if(NAS_EMM_GetSecuCurKSIasme() == ucKsiAuthReq) { NAS_EMM_SECU_LOG_WARN("NAS_EMM_MsAnyStateSsAnyStateMsgCnAuthReq: Ksi Of AUTH REQ same as Cur Ksi!"); } /*记录AUTH REQ消息携带的 KSI,Rand,Autn:AUTN USIM回复鉴权成功时,Ksi保存到stNewSecuContext,Rand保存到stNasUsimAuthParam*/ NAS_EMM_AuthReqKsi() = ucKsiAuthReq; NAS_LMM_MEM_CPY( NAS_EMM_AuthReqRandAddr(), pstAuthReq->aucRand, NAS_EMM_SECU_AUTH_RAND_LEN); NAS_LMM_MEM_CPY( NAS_EMM_AuthReqAutnAddr(), pstAuthReq->aucAutn, NAS_EMM_SECU_AUTH_AUTN_LEN); stAuth.enAuthType = USIMM_3G_AUTH; /*调用硬USIM进行鉴权*/ stAuth.unAuthPara.st3GAuth.stAutn.ulDataLen = \ (VOS_UINT8)pstAuthReq->ulAutnLen; stAuth.unAuthPara.st3GAuth.stAutn.pucData = NAS_EMM_AuthReqAutnAddr(); stAuth.unAuthPara.st3GAuth.stRand.ulDataLen = \ NAS_EMM_SECU_AUTH_RAND_LEN; stAuth.unAuthPara.st3GAuth.stRand.pucData = NAS_EMM_AuthReqRandAddr(); NAS_EMM_GetSecuAuthOpId()++; stAuth.ucOpId = NAS_EMM_GetSecuAuthOpId(); /* 调用USIM的鉴权接口,以给USIM发送鉴权消息,然后等待USIM的鉴权结果, 但不启定时器和状态等待 */ ulHardUsimAuthRslt = USIMM_AuthReq( PS_PID_MM, USIMM_UMTS_APP, &stAuth); NAS_EMM_SECU_LOG1_NORM("NAS_EMM_MsAnyStateSsAnyStateMsgCnAuthReq: USIMM_AuthReq return = ", ulHardUsimAuthRslt); return NAS_LMM_MSG_HANDLED; }