/** * Frees a CarePackage object and all its members. */ void ABC_CarePackageFree(tABC_CarePackage *pSelf) { if (pSelf) { ABC_CryptoFreeSNRP(&pSelf->pSNRP1); ABC_CryptoFreeSNRP(&pSelf->pSNRP2); ABC_CryptoFreeSNRP(&pSelf->pSNRP3); ABC_CryptoFreeSNRP(&pSelf->pSNRP4); if (pSelf->ERQ) json_decref(pSelf->ERQ); ABC_CLEAR_FREE(pSelf, sizeof(tABC_CarePackage)); } }
/** * Changes the password on an existing login object. * @param szPassword The new password. */ tABC_CC ABC_LoginPasswordSet(Login &login, const char *szPassword, tABC_Error *pError) { tABC_CC cc = ABC_CC_Ok; tABC_CarePackage *pCarePackage = NULL; tABC_LoginPackage *pLoginPackage = NULL; AutoU08Buf oldL1; AutoU08Buf oldLP1; AutoU08Buf oldLRA1; AutoU08Buf LP; AutoU08Buf LP1; AutoU08Buf LP2; // Load the packages: ABC_CHECK_RET(ABC_LoginDirLoadPackages(login.lobby().dir(), &pCarePackage, &pLoginPackage, pError)); // Load the old keys: ABC_CHECK_RET(ABC_LoginGetServerKeys(login, &oldL1, &oldLP1, pError)); if (pLoginPackage->ELRA1) { ABC_CHECK_RET(ABC_CryptoDecryptJSONObject(pLoginPackage->ELRA1, toU08Buf(login.dataKey()), &oldLRA1, pError)); } // Update SNRP2: ABC_CryptoFreeSNRP(pCarePackage->pSNRP2); pCarePackage->pSNRP2 = nullptr; ABC_CHECK_RET(ABC_CryptoCreateSNRPForClient(&pCarePackage->pSNRP2, pError)); // LP = L + P: ABC_BUF_STRCAT(LP, login.lobby().username().c_str(), szPassword); // Update EMK_LP2: json_decref(pLoginPackage->EMK_LP2); ABC_CHECK_RET(ABC_CryptoScryptSNRP(LP, pCarePackage->pSNRP2, &LP2, pError)); ABC_CHECK_RET(ABC_CryptoEncryptJSONObject(toU08Buf(login.dataKey()), LP2, ABC_CryptoType_AES256, &pLoginPackage->EMK_LP2, pError)); // Update ELP1: json_decref(pLoginPackage->ELP1); ABC_CHECK_RET(ABC_CryptoScryptSNRP(LP, pCarePackage->pSNRP1, &LP1, pError)); ABC_CHECK_RET(ABC_CryptoEncryptJSONObject(LP1, toU08Buf(login.dataKey()), ABC_CryptoType_AES256, &pLoginPackage->ELP1, pError)); // Change the server login: ABC_CHECK_RET(ABC_LoginServerChangePassword(oldL1, oldLP1, LP1, oldLRA1, pCarePackage, pLoginPackage, pError)); // Change the on-disk login: ABC_CHECK_RET(ABC_LoginDirSavePackages(login.lobby().dir(), pCarePackage, pLoginPackage, pError)); exit: ABC_CarePackageFree(pCarePackage); ABC_LoginPackageFree(pLoginPackage); return cc; }