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