VOS_UINT32 NAS_LMM_EncodeSimSecContext( NAS_NVIM_CTRL_TBL *pstNvCtrlTbl ) { VOS_UINT8 *pucNvData = VOS_NULL_PTR; LNAS_LMM_NV_EPS_SEC_CONTEXT_STRU *pstNvSecContext = VOS_NULL_PTR; VOS_UINT16 usIndex = 0; NAS_LMM_NVIM_LOG_INFO("NAS_LMM_EncodeSimSecContext is entered"); if(NAS_NVIM_NULL_PTR == pstNvCtrlTbl->pData) { NAS_LMM_NVIM_LOG_ERR("NAS_LMM_EncodeSimSecContext: WARNING->pData is Null"); return NAS_LMM_NVIM_FAIL; } pstNvSecContext = (LNAS_LMM_NV_EPS_SEC_CONTEXT_STRU *)pstNvCtrlTbl->pData; pucNvData = (VOS_UINT8 *)pstNvCtrlTbl->pNvData; /*初始化安全上下文为全FF*/ NAS_LMM_SetArrayAllBytesFF(pucNvData,NAS_EMM_GET_USIM_SECU_FILE_LEN()); /*EPS NAS Security Context Tag SMC 长度*/ pucNvData[usIndex ++] = NAS_LMM_NVIM_SECU_CONTEXT_TAG; pucNvData[usIndex ++] = NAS_LMM_NVIM_SEC_MSG_LEN; /*********** KSIASME ************/ pucNvData[usIndex ++] = NAS_LMM_NVIM_SEC_KSI_TAG; pucNvData[usIndex ++] = sizeof(VOS_UINT8); pucNvData[usIndex ++] = pstNvSecContext->ucKSIasme; /*********** KASME **************/ pucNvData[usIndex ++] = NAS_LMM_NVIM_SEC_KASME_TAG; pucNvData[usIndex ++] = NAS_LMM_NVIM_SEC_KASME_LEN; NAS_LMM_MEM_CPY( &(pucNvData[usIndex]), pstNvSecContext->aucKasme, NAS_LMM_NVIM_SEC_KASME_LEN); usIndex += NAS_LMM_NVIM_SEC_KASME_LEN; /*********** Uplink NAS count **************/ pucNvData[usIndex ++] = NAS_LMM_NVIM_SEC_UPNASCOUNT_TAG; pucNvData[usIndex ++] = sizeof(VOS_UINT32); pucNvData[usIndex ++] = (VOS_UINT8)((pstNvSecContext->ulUlNasCount >> NAS_LMM_NVIM_MOVE_24_BIT) & NAS_LMM_NVIM_BYTE_FF); pucNvData[usIndex ++] = (VOS_UINT8)((pstNvSecContext->ulUlNasCount >> NAS_LMM_NVIM_MOVE_16_BIT) & NAS_LMM_NVIM_BYTE_FF); pucNvData[usIndex ++] = (VOS_UINT8)((pstNvSecContext->ulUlNasCount >> NAS_LMM_NVIM_MOVE_8_BIT) & NAS_LMM_NVIM_BYTE_FF); pucNvData[usIndex ++] = (VOS_UINT8)((pstNvSecContext->ulUlNasCount) & NAS_LMM_NVIM_BYTE_FF); /*********** Downlink NAS count **************/ pucNvData[usIndex ++] = NAS_LMM_NVIM_SEC_DNNASCOUNT_TAG; pucNvData[usIndex ++] = sizeof(VOS_UINT32); pucNvData[usIndex ++] = (VOS_UINT8)((pstNvSecContext->ulDlNasCount >> NAS_LMM_NVIM_MOVE_24_BIT) & NAS_LMM_NVIM_BYTE_FF); pucNvData[usIndex ++] = (VOS_UINT8)((pstNvSecContext->ulDlNasCount >> NAS_LMM_NVIM_MOVE_16_BIT) & NAS_LMM_NVIM_BYTE_FF); pucNvData[usIndex ++] = (VOS_UINT8)((pstNvSecContext->ulDlNasCount >> NAS_LMM_NVIM_MOVE_8_BIT) & NAS_LMM_NVIM_BYTE_FF); pucNvData[usIndex ++] = (VOS_UINT8)((pstNvSecContext->ulDlNasCount) & NAS_LMM_NVIM_BYTE_FF); /*********** Identifiers of selected NAS integrity and encryption algorithms **************/ pucNvData[usIndex ++] = NAS_LMM_NVIM_SEC_ALG_TAG; pucNvData[usIndex ++] = sizeof(VOS_UINT8); pucNvData[usIndex ++] = pstNvSecContext->ucSecuAlg; pstNvCtrlTbl->usNvDataLen = (VOS_UINT16)NAS_EMM_GET_USIM_SECU_FILE_LEN(); NAS_LMM_NVIM_LOG1_INFO("NAS_LMM_EncodeSimSecContext: ESP SEC CONTEXT",pstNvCtrlTbl->usNvDataLen); NAS_LMM_NVIM_LOG_INFO("NAS_LMM_EncodeSimSecContext: ESP SEC CONTEXT"); NAS_COMM_PrintArray(NAS_COMM_GET_MM_PRINT_BUF(),pucNvData,pstNvCtrlTbl->usNvDataLen); /* 如果上次写卡的码流与本次要写入的完全相同,则无需写入 */ if((0 == NAS_LMM_MEM_CMP( (const VOS_VOID *)NAS_LMM_GET_USIM_EPS_SECU_CONTEXT_ADDR(), (const VOS_VOID *)pucNvData, pstNvCtrlTbl->usNvDataLen))) { NAS_LMM_NVIM_LOG_INFO("NAS_LMM_EncodeSimPsLoc: Equal value!"); return NAS_LMM_NVIM_WRITTEN_UNNEEDED; } /* 不相同,更新为本次写卡码流 */ NAS_LMM_MEM_SET(NAS_LMM_GET_USIM_EPS_SECU_CONTEXT_ADDR(), 0, NAS_NVIM_SECU_CONTEXT_MAX_LEN); /* 如果长度大于缓存区,则认为异常不保存上次写卡码流 */ if(NAS_NVIM_SECU_CONTEXT_MAX_LEN >= pstNvCtrlTbl->usNvDataLen) { NAS_LMM_MEM_CPY(NAS_LMM_GET_USIM_EPS_SECU_CONTEXT_ADDR(), pucNvData, pstNvCtrlTbl->usNvDataLen); } return NAS_LMM_NVIM_OK; }
VOS_UINT32 NAS_LMM_EncodeSimPsLoc( NAS_NVIM_CTRL_TBL *pstNvCtrlTbl ) { NAS_LMM_GUTI_STRU stGuti; NAS_MM_TA_STRU stTai; VOS_UINT8 *pucNvData; VOS_UINT8 *pucData; VOS_UINT16 usIndex = 0; VOS_UINT32 ulLen = 0; VOS_UINT8 *pstLastPsLoc; NAS_LMM_NVIM_LOG_INFO("NAS_LMM_EncodeSimPsLoc is entered"); pstLastPsLoc = NAS_LMM_GetEmmInfoLastWriteUsimPsLocAddr(); if(NAS_NVIM_NULL_PTR == pstNvCtrlTbl->pData) { NAS_LMM_NVIM_LOG_ERR("NAS_LMM_EncodeSimPsLoc: WARNING->pData is Null"); return NAS_LMM_NVIM_FAIL; } pucData = (VOS_UINT8 *)pstNvCtrlTbl->pData; pucNvData = (VOS_UINT8 *)pstNvCtrlTbl->pNvData; /*****************GUTI*******************/ ulLen = sizeof(VOS_UINT32); NAS_LMM_MEM_CPY( &stGuti, &(pucData[ulLen]), sizeof(NAS_LMM_GUTI_STRU)); pucNvData[usIndex ++] = NAS_LMM_NVIM_GUTI_AND_OETOI_LEN; pucNvData[usIndex ++] = (stGuti.stGutiHead.ucOeToi | NAS_EMM_HIGH_HALF_BYTE_F); pucNvData[usIndex ++] = stGuti.stPlmnId.aucPlmnId[0]; pucNvData[usIndex ++] = stGuti.stPlmnId.aucPlmnId[1]; pucNvData[usIndex ++] = stGuti.stPlmnId.aucPlmnId[2]; pucNvData[usIndex ++] = stGuti.stMmeGroupId.ucGroupId; pucNvData[usIndex ++] = stGuti.stMmeGroupId.ucGroupIdCnt; pucNvData[usIndex ++] = stGuti.stMmeCode.ucMmeCode; /*pucNvData[usIndex ++] = stGuti.stMTmsi.ucMTmsi;*/ NAS_LMM_MEM_CPY( &(pucNvData[usIndex]), &(stGuti.stMTmsi), sizeof(NAS_LMM_MTMSI_STRU)); usIndex += sizeof(NAS_EMM_MTMSI_STRU); /*L.V.R TAI*/ ulLen += sizeof(NAS_LMM_GUTI_STRU); NAS_LMM_MEM_CPY( &stTai, &(pucData[ulLen]), sizeof(NAS_MM_TA_STRU)); pucNvData[usIndex ++] = stTai.stPlmnId.aucPlmnId[0]; pucNvData[usIndex ++] = stTai.stPlmnId.aucPlmnId[1]; pucNvData[usIndex ++] = stTai.stPlmnId.aucPlmnId[2]; pucNvData[usIndex ++] = stTai.stTac.ucTac; pucNvData[usIndex ++] = stTai.stTac.ucTacCnt; /*UPDATE STATUS*/ ulLen += sizeof(NAS_MM_TA_STRU); pucNvData[usIndex++] = pucData[ulLen]; pstNvCtrlTbl->usNvDataLen = usIndex; /* 如果上次写卡的码流与本次要写入的完全相同,则无需写入 */ if((0 == NAS_LMM_MEM_CMP( (const VOS_VOID *)pstLastPsLoc, (const VOS_VOID *)pucNvData, pstNvCtrlTbl->usNvDataLen))) { NAS_LMM_NVIM_LOG_INFO("NAS_LMM_EncodeSimPsLoc: Equal value!"); return NAS_LMM_NVIM_WRITTEN_UNNEEDED; } /* 不相同,更新为本次写卡码流 */ NAS_LMM_MEM_SET( pstLastPsLoc, 0, sizeof(LNAS_LMM_NV_EPS_LOC_STRU)); NAS_LMM_MEM_CPY( pstLastPsLoc, pucNvData, pstNvCtrlTbl->usNvDataLen); return NAS_LMM_NVIM_OK; }
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; }