示例#1
0
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);
}
示例#2
0
文件: aes_ecb.cpp 项目: rongc5/test
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*/
}
示例#4
0
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);
}