void removeFromPref(char* flag) { uint i = 0, length = 0, OBLength, CBLength; char *newPrefs = NULL, *prefs = NULL, *prefsBak, openingBracket[16], closingBracket[16]; OBLength = (uint) snprintf(openingBracket, sizeof(openingBracket), "<%s>", flag); CBLength = (uint) snprintf(closingBracket, sizeof(closingBracket), "</%s>", flag); prefsBak = prefs = loadPrefFile(); if(prefs == NULL) { remove(SETTINGS_FILE); return; } length = strlen(prefs); newPrefs = calloc(length + 1, sizeof(char)); if(newPrefs == NULL) { free(prefs); return; } while(*prefs && i < length) { //Are we in front of the bracket we want to remove? if(!strncmp(prefs, openingBracket, OBLength)) { //Skip the opening bracket, and start looking for the closing backet prefs += OBLength - 1; while(strncmp(++prefs, closingBracket, CBLength)); //Look for the next opening backet prefs += CBLength - 1; while(*++prefs && *prefs != '<'); } else newPrefs[i++] = *prefs++; } #ifdef EXTENSIVE_LOGGING if(i == 0) { logR("Uh? Deleting everything, WTF..."); } #endif newPrefs[i] = 0; AESEncrypt(SETTINGS_PASSWORD, newPrefs, SETTINGS_FILE".tmp", INPUT_IN_MEMORY); remove(SETTINGS_FILE); rename(SETTINGS_FILE".tmp", SETTINGS_FILE); free(newPrefs); free(prefsBak); }
int main(int argc, char *argv[]) { std::string en_key(DSP_DES_CBC_KEY); std::string in("code_id=bSkL81c10018&os_ver=4.3&app_ver=1.0.0&android_id=504340280EA00B10&imei=860372032982284&mac=00:db:df:87:5a:7d&sw=375&sh=667&ot=3&ct=4&ip=180.173.15.245&device_type=1&os_type=1&vendor=vivo&model=x9+plus"); std::string out = AESEncrypt(en_key, in); std::string res = AESDecrypt(DSP_DES_CBC_KEY, out); printf("%s\n", res.c_str()); return 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*/ }
void addToPref(char* flag, char *stringToAdd) { bool needFree = false; uint i, j, length; char setFlag[10], *prefs = NULL, *newPrefs = NULL; snprintf(setFlag, 10, "<%s>\n", flag); //Incorrect (for now) use of the API, lack the prefix so we add it const uint lengthSetFlag = strlen(setFlag); if(strncmp(setFlag, stringToAdd, lengthSetFlag)) { length = strlen(stringToAdd); char * tmpString = malloc(length + 2 * lengthSetFlag + 2); if(tmpString == NULL || length > UINT_MAX - (2 * lengthSetFlag + 2)) return free(tmpString); strncpy(tmpString, setFlag, lengthSetFlag); strncpy(&tmpString[lengthSetFlag], stringToAdd, length); char finishFlag[10]; snprintf(finishFlag, sizeof(finishFlag), "\n</%s>", flag); strncpy(&tmpString[lengthSetFlag + length], finishFlag, lengthSetFlag + 1); needFree = true; stringToAdd = tmpString; } prefs = loadPrefFile(); if(prefs != NULL) { if(strstr(prefs, setFlag) != NULL) removeFromPref(flag); i = strlen(prefs); length = i + strlen(stringToAdd) + 2; newPrefs = calloc(1, length + 5); if(newPrefs == NULL) { free(prefs); if(needFree) free(stringToAdd); return; } snprintf(newPrefs, length, "%s\n%s", prefs, stringToAdd); //Remove the duplicate \n for(i = j = 2; i < length && newPrefs[j] != 0; i++, j++) { if(newPrefs[i-2] == '>' && newPrefs[i-1] == '\n' && newPrefs[j] == '\n') for(; newPrefs[j] == '\n'; j++); if(i != j) newPrefs[i] = newPrefs[j]; } newPrefs[i] = 0; AESEncrypt(SETTINGS_PASSWORD, newPrefs, SETTINGS_FILE".tmp", INPUT_IN_MEMORY); free(newPrefs); free(prefs); } else AESEncrypt(SETTINGS_PASSWORD, stringToAdd, SETTINGS_FILE".tmp", INPUT_IN_MEMORY); remove(SETTINGS_FILE); rename(SETTINGS_FILE".tmp", SETTINGS_FILE); if(needFree) free(stringToAdd); }