/*lint -e961*/ VOS_UINT32 NAS_EMM_DeriveKasme( const VOS_UINT8 *pucCK, const VOS_UINT8 *pucIK, VOS_UINT8 *pucKasme) { VOS_UINT8 aucAlgParam[NAS_EMM_SECU_MAX_ALG_PARAM_LEN]; VOS_UINT8 aucKeyParam[NAS_LMM_SECU_AUTH_KEY_ASME_LEN]; VOS_UINT32 ulIndex = 0; VOS_UINT32 ulRslt = NAS_EMM_SECU_FAIL; NAS_EMM_PLMN_ID_STRU *pstSerPlmn = VOS_NULL_PTR; NAS_EMM_SECU_LOG_INFO("NAS_EMM_DeriveKasme is entered."); /*空指针*/ if((VOS_NULL_PTR == pucCK) || (VOS_NULL_PTR == pucIK)) { NAS_EMM_SECU_LOG_ERR("NAS_EMM_DeriveKasme:-> Input Pointer Null!"); return NAS_EMM_SECU_FAIL; } /*获取 current PLMN作为计算Kasme的参数*/ pstSerPlmn = NAS_LMM_GetEmmInfoPresentPlmnAddr(); /* 编码KDF算法需要的参数 */ /*encode FC*/ aucAlgParam[ulIndex++] = NAS_EMM_SECU_ALG_PARAM_KASME_FC; /*encode PLMNID&Len*/ aucAlgParam[ulIndex++] = pstSerPlmn->aucPlmnId[0]; aucAlgParam[ulIndex++] = pstSerPlmn->aucPlmnId[1]; aucAlgParam[ulIndex++] = pstSerPlmn->aucPlmnId[2]; aucAlgParam[ulIndex++] = NAS_EMM_SECU_ALG_PARAM_KASME_PRE_LEN; aucAlgParam[ulIndex++] = NAS_EMM_SECU_ALG_PARAM_KASME_PLMNID_LEN; /* encode SQN&AK */ NAS_LMM_MEM_CPY( &aucAlgParam[ulIndex], NAS_EMM_AuthReqAutnAddr(), NAS_EMM_SECU_SQN_LEN); ulIndex += NAS_EMM_SECU_SQN_LEN; aucAlgParam[ulIndex++] = NAS_EMM_SECU_ALG_PARAM_KASME_PRE_LEN; aucAlgParam[ulIndex++] = NAS_EMM_SECU_SQN_LEN; NAS_LMM_MEM_CPY((VOS_VOID *)aucKeyParam,pucCK,NAS_EMM_SECU_CKEY_LEN); NAS_LMM_MEM_CPY((VOS_VOID *)&aucKeyParam[NAS_EMM_SECU_CKEY_LEN], pucIK,NAS_EMM_SECU_IKEY_LEN); ulRslt = NAS_EMM_KDF_HmacSha256(aucAlgParam,ulIndex,aucKeyParam,pucKasme); return ulRslt; }
/*lint -e960*/ VOS_VOID NAS_EMM_SendRejEventToSTK(VOS_UINT8 ucCauseCode, LNAS_STK_UPDATE_TYPE_ENUM_UINT8 enUpdateType) { LNAS_STK_NETWORK_REJECTION_EVENT_STRU *pEmmNetworkRejectMsg; NAS_MM_PLMN_ID_STRU *pEmmPlmnID; NAS_MM_TAC_STRU *pEmmTac; NAS_EMM_ATTACH_LOG_NORM("NAS_EMM_SendRejEventToSTK is entered"); /*申请消息内存*/ pEmmNetworkRejectMsg = (VOS_VOID *)NAS_LMM_ALLOC_MSG(sizeof(LNAS_STK_NETWORK_REJECTION_EVENT_STRU)); /*判断申请结果,若失败打印错误并退出*/ if (NAS_EMM_NULL_PTR == pEmmNetworkRejectMsg) { /*打印错误*/ NAS_EMM_ATTACH_LOG_ERR("NAS_EMM_SendRejEventToSTK: MSG ALLOC ERR!"); return; } /*构造ID_LNAS_STK_NETWORK_REJECTION_EVENT消息*/ /*填充消息头*/ NAS_EMM_STK_MSG_HEADER( pEmmNetworkRejectMsg, (sizeof(LNAS_STK_NETWORK_REJECTION_EVENT_STRU)- NAS_EMM_LEN_VOS_MSG_HEADER)); /*填充消息ID*/ pEmmNetworkRejectMsg->ulMsgName = ID_LNAS_STK_NETWORK_REJECTION_EVENT; /*填充消息内容*/ pEmmNetworkRejectMsg->stNetworkRejectionEvent.ucCauseCode = ucCauseCode; /*填充消息plmn*/ pEmmPlmnID = NAS_LMM_GetEmmInfoPresentPlmnAddr(); pEmmNetworkRejectMsg->stNetworkRejectionEvent.stTaiInfo.stCurPlmnID.aucPlmnId[0] = pEmmPlmnID->aucPlmnId[0]; pEmmNetworkRejectMsg->stNetworkRejectionEvent.stTaiInfo.stCurPlmnID.aucPlmnId[1] = pEmmPlmnID->aucPlmnId[1]; pEmmNetworkRejectMsg->stNetworkRejectionEvent.stTaiInfo.stCurPlmnID.aucPlmnId[2] = pEmmPlmnID->aucPlmnId[2]; /*填充消息TAC*/ pEmmTac = NAS_LMM_GetEmmInfoPresentTacAddr(); pEmmNetworkRejectMsg->stNetworkRejectionEvent.stTaiInfo.stTac.ucTac = pEmmTac->ucTac; pEmmNetworkRejectMsg->stNetworkRejectionEvent.stTaiInfo.stTac.ucTacCnt = pEmmTac->ucTacCnt; /*填充消息enUpdateAttachType*/ pEmmNetworkRejectMsg->stNetworkRejectionEvent.enUpdateAttachType = enUpdateType; /*向stk发送rejection消息*/ NAS_LMM_SEND_MSG(pEmmNetworkRejectMsg); return; }
VOS_UINT32 NAS_LMM_CheckModifyT3402DefaultValue( VOS_VOID) { NAS_MM_PLMN_ID_STRU *pstPresentPlmnId = NAS_EMM_NULL_PTR; pstPresentPlmnId = NAS_LMM_GetEmmInfoPresentPlmnAddr(); if ((NAS_EMM_AD_BIT_SLCT == NAS_LMM_GetEmmInfoOpLastRegPlmn()) && (NAS_LMM_MATCH_FAIL == NAS_LMM_PlmnMatch(pstPresentPlmnId, NAS_LMM_GetEmmInfoLastRegPlmnAddr()))) { if ((NAS_EMM_AD_BIT_SLCT == NAS_LMM_GetEmmInfoNetInfoOpEplmnListAddr()) && (NAS_LMM_MATCH_FAIL == NAS_LMM_PlmnIDMatchPlmnList(pstPresentPlmnId, NAS_LMM_GetEmmInfoNetInfoEplmnListAddr()))) { return VOS_TRUE; } } return VOS_FALSE; }
VOS_VOID NAS_EMM_ProcRejCauseVal15() { NAS_MM_TA_STRU stTa; MMC_LMM_LTE_NO_SUBSCRIBE_PLMN_LIST_STRU stLteNoSubsPlmnList; /* 获取当前TA */ NAS_EMM_GetCurrentTa(&stTa); NAS_EMM_AttDataUpdate(NAS_EMM_NOT_DELETE_RPLMN); if (NAS_EMMC_USER_SPEC_PLMN_YES == NAS_EMMC_GetUserSpecPlmnFlag()) { NAS_EMM_AddForbTa(&stTa,NAS_LMM_GetEmmInfoNetInfoForbTaForRej15Addr()); } else { NAS_EMM_AddForbTa(&stTa,NAS_LMM_GetEmmInfoNetInfoForbTaForRoamAddr()); NAS_EMMC_SendRrcCellSelectionReq(LRRC_LNAS_FORBTA_CHANGE); } if (EMM_ATTACH_CAUSE_ESM_ATTACH_FOR_INIT_EMC_BERER == NAS_EMM_GLO_AD_GetAttCau()) { /* 通知ESM紧接着EMM还要做紧急注册,ESM不需要清除动态表中的紧急PDN建立记录 */ NAS_EMM_AttSendEsmResult(EMM_ESM_ATTACH_STATUS_EMC_ATTACHING); } else { /*向ESM发送ATTACH结果*/ NAS_EMM_AttSendEsmResult(EMM_ESM_ATTACH_STATUS_DETACHED); } /*修改状态:进入主状态DEREG子状态DEREG_LIMITED_SERVICE*/ NAS_EMM_AdStateConvert( EMM_MS_DEREG, EMM_SS_DEREG_LIMITED_SERVICE, TI_NAS_EMM_STATE_NO_TIMER); /* 向MMC发送结果 */ NAS_EMM_AppSendAttRej(); /*被15拒绝,当前PLMN只有一个*/ stLteNoSubsPlmnList.ulPlmnNum = 1; /*拷贝当前PLMN*/ NAS_LMM_MEM_CPY(&(stLteNoSubsPlmnList.astPlmnId[0]), NAS_LMM_GetEmmInfoPresentPlmnAddr(), sizeof(MMC_LMM_PLMN_ID_STRU)); /*如果网络侧带了扩展原因值,而且当前对应值是EUTRAN NOT ALLOW,则走正常的协议流程*/ if((NAS_EMM_BIT_SLCT == NAS_EMM_GLO_AD_OP_GetAttRejEmmExtCau()) &&(NAS_EMM_EUTRAN_NOT_ALLOWED == NAS_EMM_GLO_AD_GetAttRejEmmExtCau())) { /*被15原因值拒绝而且当前有扩展原因值,指示USIM未在LTE开户,走正常的LTE未开户流程*/ NAS_EMM_SetLteNoSubscribeExtCauseFlag(NAS_EMM_EUTRAN_NOT_ALLOWED); NAS_LMM_LteNoSubscribeWithExtCauseHandle(&stLteNoSubsPlmnList); } else { /*被15原因值拒绝但是没有带扩展原因值,走LTE未开户定制流程*/ NAS_LMM_LteNoSubscribeWithOutExtCauseHandle(&stLteNoSubsPlmnList); } NAS_EMM_WaitNetworkRelInd(); if (EMM_ATTACH_CAUSE_ESM_EMC_ATTACH == NAS_EMM_GLO_AD_GetAttCau()) { /* 通知IMSA再尝试CS域 */ } return; }
VOS_VOID NAS_EMM_TAU_TAUReqRejectCasue15() { NAS_MM_TA_STRU stCurrentTa; NAS_MM_TA_LIST_STRU *pstTaiList; MMC_LMM_LTE_NO_SUBSCRIBE_PLMN_LIST_STRU stLteNoSubsPlmnList; /* 打印进入该函数, INFO_LEVEL */ NAS_EMM_TAU_LOG_INFO( "Nas_Emm_Tau_TAUReqRejectCasue15 is entered."); NAS_LMM_SetEmmInfoRegDomain(NAS_LMM_REG_DOMAIN_PS); /*设置EU3 ROAMING NOT ALLOWED*/ NAS_LMM_GetMmAuxFsmAddr()->ucEmmUpStat = EMM_US_ROAMING_NOT_ALLOWED_EU3; /* lihong00150010 emergency tau&service begin */ if (NAS_LMM_REG_STATUS_EMC_REGED != NAS_LMM_GetEmmInfoRegStatus()) { /*保存PS LOC信息*/ NAS_LMM_WritePsLoc(NAS_NV_ITEM_UPDATE); } /* lihong00150010 emergency tau&service end */ /*重置TAU计数器*/ NAS_EMM_TAU_SaveEmmTAUAttemptCnt(NAS_EMM_TAU_ATTEMPT_CNT_ZERO); /*被15拒绝,当前PLMN只有一个*/ stLteNoSubsPlmnList.ulPlmnNum = 1; /*拷贝当前PLMN*/ NAS_LMM_MEM_CPY(&(stLteNoSubsPlmnList.astPlmnId[0]), NAS_LMM_GetEmmInfoPresentPlmnAddr(), sizeof(MMC_LMM_PLMN_ID_STRU)); if((NAS_EMM_BIT_SLCT == NAS_EMM_TAU_GetEmmTauCnEmmExtRejCauseOp()) &&(NAS_EMM_EUTRAN_NOT_ALLOWED == NAS_EMM_TAU_GetEmmTauCnEmmExtRejCause())) { /*被15原因值拒绝而且当前有扩展原因值,指示USIM未在LTE开户,走正常的LTE未开户流程*/ NAS_EMM_SetLteNoSubscribeExtCauseFlag(NAS_EMM_EUTRAN_NOT_ALLOWED); NAS_LMM_LteNoSubscribeWithExtCauseHandle(&stLteNoSubsPlmnList); } else { /*被15原因值拒绝但是没有带扩展原因值,走LTE未开户定制流程*/ NAS_LMM_LteNoSubscribeWithOutExtCauseHandle(&stLteNoSubsPlmnList); } /*Remove current TA from TAI List*/ NAS_EMM_GetCurrentTa(&stCurrentTa); pstTaiList = NAS_LMM_GetEmmInfoNetInfoTaiListAddr(); NAS_LMM_DeleteTaFromTaList(&stCurrentTa, pstTaiList, NAS_MM_MAX_TA_NUM); if (NAS_EMMC_USER_SPEC_PLMN_YES == NAS_EMMC_GetUserSpecPlmnFlag()) { NAS_EMM_AddForbTa(&stCurrentTa,NAS_LMM_GetEmmInfoNetInfoForbTaForRej15Addr()); } else { /*store the current TAI in the list of "forbidden tracking areas for roaming"*/ NAS_EMM_AddForbTa(&stCurrentTa,NAS_LMM_GetEmmInfoNetInfoForbTaForRoamAddr()); NAS_EMMC_SendRrcCellSelectionReq(LRRC_LNAS_FORBTA_CHANGE); } /* lihong00150010 emergency tau&service begin */ if (NAS_EMM_TAU_START_CAUSE_ESM_EMC_PDN_REQ == NAS_EMM_TAU_GetEmmTAUStartCause()) { NAS_EMM_TAU_LOG_INFO("NAS_EMM_TAU_TAUReqRejectCasue15:CAUSE_ESM_EMC_PDN_REQ"); NAS_EMM_EmcPndReqTauAbnormalCommProc( NAS_EMM_MmcSendTauActionResultIndRej, (VOS_VOID*)NAS_EMM_NULL_PTR, EMM_SS_DEREG_LIMITED_SERVICE); } else { /*发送EMM_ESM_STATUS_IND(去注册)*/ NAS_EMM_TAU_SendEsmStatusInd(EMM_ESM_ATTACH_STATUS_ATTACHED); /*转换EMM状态机MS_REG+SS_REG_LIMITED_SERVICE*/ NAS_EMM_TAUSER_FSMTranState(EMM_MS_REG, EMM_SS_REG_LIMITED_SERVICE, TI_NAS_EMM_STATE_NO_TIMER); /****检查冲突标志并做相应的处理********************************************/ /* 上报TAU结果在冲突中处理 */ NAS_EMM_TAU_RelCause1315CollisionProc(NAS_EMM_MmcSendTauActionResultIndRej, (VOS_VOID*)NAS_EMM_NULL_PTR); } /* lihong00150010 emergency tau&service end */ NAS_EMM_WaitNetworkRelInd(); return; }