예제 #1
0
VOS_UINT32 USIMM_GetVsimFile(USIMM_GETFILE_REQ_STRU  *pstMsg)
{
    VOS_UINT32                  ulFileNum = 0;
    USIMM_GETCNF_INFO_STRU      stCnfInfo;

    VOS_MemSet(&stCnfInfo, 0, sizeof(stCnfInfo));

    stCnfInfo.ucRecordNum      = pstMsg->ucRecordNum;
    stCnfInfo.usEfId           = pstMsg->usFileID;

    if(VOS_OK == USIMM_PoolFindFile(pstMsg->usFileID, &ulFileNum, USIMM_UNLIMIT_APP))
    {
        stCnfInfo.usDataLen    = gstUSIMMPOOL.astpoolRecord[ulFileNum].usLen;
        stCnfInfo.usEfLen      = gstUSIMMPOOL.astpoolRecord[ulFileNum].usLen;
        stCnfInfo.pucEf        = gstUSIMMPOOL.astpoolRecord[ulFileNum].pucContent;
        stCnfInfo.ucTotalNum   = 1;

        USIMM_INFO_LOG("USIMM_GetVSimFile: Get File Success from Usimm Pool");

        USIMM_GetFileCnf(pstMsg->ulSenderPid, pstMsg->ulSendPara, USIMM_SW_OK, &stCnfInfo);
    }
    else
    {
        stCnfInfo.usDataLen    = VOS_NULL;
        stCnfInfo.usEfLen      = VOS_NULL;
        stCnfInfo.pucEf        = VOS_NULL_PTR;

        USIMM_INFO_LOG("USIMM_GetVSimFile: Get File Failed from Usimm Pool");

        USIMM_GetFileCnf(pstMsg->ulSenderPid, pstMsg->ulSendPara, USIMM_SW_NOFILE_FOUND, &stCnfInfo);
    }
    return VOS_OK;
}
VOS_VOID USIMM_CardStatusInd(VOS_UINT32                     ulReceiverPid,
                                    USIMM_CARD_TYPE_ENUM_UINT32     enCardType,
                                    USIMM_CARD_SERVIC_ENUM_UINT32   enCardStatus)
{
    PS_USIM_STATUS_IND_STRU            *pUsimMsg = VOS_NULL_PTR;
    VOS_UINT32                          ulResult;
    VOS_UINT32                          ulFileNum;
    VOS_UINT8                          *pucIMSI = VOS_NULL_PTR;

    if(USIMM_CARD_SERVIC_AVAILABLE == enCardStatus)
    {
        ulResult = USIMM_PoolFindFile(EFIMSI, &ulFileNum, USIMM_UNLIMIT_APP);

        if(VOS_OK == ulResult)
        {
            pucIMSI = gstUSIMMPOOL.astpoolRecord[ulFileNum].pucContent;
        }
    }

    pUsimMsg = (PS_USIM_STATUS_IND_STRU *)VOS_AllocMsg(WUEPS_PID_USIM, sizeof(PS_USIM_STATUS_IND_STRU)-VOS_MSG_HEAD_LENGTH);

    if( VOS_NULL_PTR == pUsimMsg )
    {
        USIMM_ERROR_LOG("USIMM_CardStatusInd: VOS_AllocMsg is Failed");

        return;
    }

    pUsimMsg->ulReceiverPid = ulReceiverPid;
    pUsimMsg->ulMsgName     = PS_USIM_GET_STATUS_IND;    /* 设置消息名称 */
    pUsimMsg->enCardType    = enCardType;
    pUsimMsg->enCardStatus  = enCardStatus;

    if(VOS_NULL_PTR != pucIMSI)
    {
        VOS_MemCpy(pUsimMsg->aucIMSI, pucIMSI, sizeof(pUsimMsg->aucIMSI));

        pUsimMsg->ucIMSILen = sizeof(pUsimMsg->aucIMSI);
    }
    else
    {
        pUsimMsg->ucIMSILen = VOS_NULL;
    }

    (VOS_VOID)VOS_SendMsg(pUsimMsg->ulSenderPid, pUsimMsg);

    if(USIMM_CARD_SERVIC_AVAILABLE != enCardStatus) /*卡状态不是有卡,保存数据*/
    {
        USIMM_SaveLogFile();
    }

    g_stUSIMMLogData.enLogState = USIMM_NO_NEED_LOG;/*上报卡状态就不需要记录log*/

    return;
}
예제 #3
0
VOS_UINT32 USIMM_VsimConfidentialDataVerify(VOS_VOID)
{
    VOS_UINT32                          ulImsiLen;
    VOS_UINT32                          ulSimkeyLen;
    VOS_INT32                           lResult;
    VOS_UINT32                          ulRecordNum;
    VOS_INT                             lDataLen;
    VOS_INT                             lHashLen;
    VOS_UINT8                          *pucImsi;
    VOS_UINT8                           aucData[USIMM_EF_IMSI_LEN * 2 + USIMM_VSIM_SECUR_MAX_LEN * 4];
    VOS_UINT8                           aucHashData[USIMM_VSIM_HASH_LEN];
    VOS_UINT8                           aucKey[VSIM_DH_AGREE_KEY] = {0};
    VOS_UINT8                           aucCipher[USIMM_VSIM_SIM_KEY_HASH_LEN/2];
    VOS_UINT8                           aucSimkey[USIMM_VSIM_SIM_KEY_HASH_LEN/2];
    NVIM_VSIM_HVSDH_NV_STRU             stNVDHKey;
    DH_KEY                              stDHPara;
    VSIM_KEYDATA_STRU                   stCPrivateKey;   /* 单板私钥 */

    VOS_MemSet(&stDHPara, 0, sizeof(stDHPara));

    /* 查询文件位置,这里不能直接调用USIMM_GetCachedFile,服务状态的全局变量未设置 */
    if (VOS_ERR == USIMM_PoolFindFile(EFIMSI, &ulRecordNum, USIMM_UNLIMIT_APP))
    {
        USIMM_ERROR_LOG("USIMM_VsimConfidentialDataVerify: File Could not Found");

        return VOS_ERR;
    }

    if (VOS_NULL_PTR == gstUSIMMPOOL.astpoolRecord[ulRecordNum].pucContent)
    {
        USIMM_ERROR_LOG("USIMM_VsimConfidentialDataVerify: File Content is Empty");

        return VOS_ERR;
    }

    ulImsiLen = gstUSIMMPOOL.astpoolRecord[ulRecordNum].usLen;

    pucImsi   = gstUSIMMPOOL.astpoolRecord[ulRecordNum].pucContent;

    USIMM_VsimBase16Encode(pucImsi, aucData, ulImsiLen);

    VOS_MemCpy(aucData + ulImsiLen * 2,
               g_stUSIMMVSimAuthInfo.stBase16Ki.aucData,
               g_stUSIMMVSimAuthInfo.stBase16Ki.ulLen);

    VOS_MemCpy(aucData + ulImsiLen * 2 + g_stUSIMMVSimAuthInfo.stBase16Ki.ulLen,
               g_stUSIMMVSimAuthInfo.stBase16Opc.aucData,
               g_stUSIMMVSimAuthInfo.stBase16Opc.ulLen);

    lDataLen = (VOS_INT)(ulImsiLen * 2 + g_stUSIMMVSimAuthInfo.stBase16Ki.ulLen + g_stUSIMMVSimAuthInfo.stBase16Opc.ulLen);

    /* 用IMSI+KI+OPC的长度和内容数据计算HASH */
    lHashLen = USIMM_VSIM_HASH_LEN;

    lResult  = CRYPTO_HASH((VOS_CHAR *)aucData,
                           lDataLen,
                           CRYPTO_ALGORITHM_SHA256,
                           (VOS_CHAR *)aucHashData,
                           &lHashLen);

    if ((VOS_OK != lResult)
      ||(USIMM_VSIM_HASH_LEN != lHashLen))
    {
        USIMM_ERROR_LOG("USIMM_VsimConfidentialDataVerify: CRYPTO_HASH Failed");

        return VOS_ERR;
    }

    if (NV_OK != NV_Read(en_NV_Item_VSIM_HVSDH_INFO, &stNVDHKey, sizeof(NVIM_VSIM_HVSDH_NV_STRU)))
    {
        USIMM_ERROR_LOG("USIMM_VsimConfidentialDataVerify: NV Read Key is Failed");

        return VOS_ERR;
    }
    /* [false alarm]:fortify */
    if (VOS_OK != USIMM_VsimHUKDecode(stNVDHKey.stCPrivateKey.aucKey, 
                                        VSIM_DH_PRIVATE_KEY, 
                                        stCPrivateKey.aucKey, 
                                        &stCPrivateKey.ulKeyLen))
    {
        USIMM_ERROR_LOG("USIMM_VsimConfidentialDataVerify: USIMM_VsimHUKDecode is Failed");/* [false alarm]:fortify */

        return VOS_ERR;
    }

    VOS_MemCpy(stDHPara.privateValue, stCPrivateKey.aucKey, VSIM_DH_PRIVATE_KEY);

    stDHPara.priVallen = VSIM_DH_PRIVATE_KEY;

    DH_FillFixParams(&stDHPara);

    if (VOS_OK != DH_ComputeAgreedKey(aucKey, stNVDHKey.stSPublicKey.aucKey, &stDHPara))
    {
        USIMM_ERROR_LOG("USIMM_VsimConfidentialDataVerify: DH_ComputeAgreedKey is Failed");

        return VOS_ERR;
    }

    AESEncrypt(aucHashData, lHashLen, aucKey, sizeof(aucKey), aucCipher, USIMM_VSIM_SIM_KEY_HASH_LEN/2);

    if (VOS_OK != USIMM_VsimBase16Decode((VOS_CHAR *)g_stUSIMMVSimAuthInfo.aucSimKeyHash, USIMM_VSIM_SIM_KEY_HASH_LEN, aucSimkey, &ulSimkeyLen))
    {
        USIMM_ERROR_LOG("USIMM_VsimConfidentialDataVerify: USIMM_VsimBase16Decode Failed");

        return VOS_ERR;
    }

#ifndef OAM_DMT
    if (VOS_OK == VOS_MemCmp(aucSimkey, aucCipher, USIMM_VSIM_SIM_KEY_HASH_LEN/2))
    {
        return VOS_OK;
    }

    return VOS_ERR;
#else
    return VOS_OK;
#endif  /*OAM_DMT*/
}