/*****************************************************************************
 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);

}
Beispiel #2
0
/*****************************************************************************
 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;

}