diff --git a/services/package/pkg_verify/pkg_verify_util.cpp b/services/package/pkg_verify/pkg_verify_util.cpp index 4725e1af4eeb3aacd0479e879967876e43273943..904c6f85780680ccaf0cd92e577c9298951b7518 100644 --- a/services/package/pkg_verify/pkg_verify_util.cpp +++ b/services/package/pkg_verify/pkg_verify_util.cpp @@ -195,19 +195,52 @@ int32_t PkgVerifyUtil::Pkcs7verify(std::vector &signature, std::vector< return pkcs7.GetHashFromSignBlock(signature.data(), signature.size(), hash); } -int32_t PkgVerifyUtil::HashCheck(const PkgStreamPtr srcData, const size_t dataLen, - const std::vector &hash, const std::string &path) const +std::string PkgVerifyUtil::GetPkgTime(const std::string &pkgPath) const { - Updater::UPDATER_INIT_RECORD; struct stat statInfo {}; std::string fileInfo = "valid info"; - if (stat(path.c_str(), &statInfo) != 0) { + if (stat(pkgPath.c_str(), &statInfo) != 0) { PKG_LOGE("get file info error"); } else { fileInfo = "pkg size is " + std::to_string(statInfo.st_size) + " , pkg last change time is " + ctime(&statInfo.st_mtime); PKG_LOGI(fileInfo.c_str()); } + return fileInfo; +} + +void PkgVerifyUtil::WriteHash(std::vector &hash, const std::string &pkgPath) const +{ + Updater::UPDATER_INIT_RECORD; + std::string path = "/data/updater/hash_file"; + if (access(path.c_str(), F_OK) != 0) { + std::ofstream file(path, std::ios::out); + if (!file) { + PKG_LOGE("open file failed"); + return; + } + file.write(reinterpret_cast(hash.data()), sizeof(hash)); + return; + } + std::ifstream file(path, std::ios::in); + if (!file) { + PKG_LOGE("open file failed"); + return; + } + std::string lastHash {}; + if (getline(file, lastHash)) { + std::vector lastHashVector {}; + lastHashVector.assign(lastHash.begin(), lastHash.end()); + UPDATER_LAST_WORD(ConvertShaHex(static_cast>(lastHashVector)), + ConvertShaHex(hash), GetPkgTime(pkgPath)); + } +} + +int32_t PkgVerifyUtil::HashCheck(const PkgStreamPtr srcData, const size_t dataLen, + const std::vector &hash, const std::string &path) const +{ + Updater::UPDATER_INIT_RECORD; + std::string fileInfo = GetPkgTime(path); if (srcData == nullptr || dataLen == 0) { UPDATER_LAST_WORD(PKG_INVALID_PARAM); return PKG_INVALID_PARAM; @@ -232,6 +265,7 @@ int32_t PkgVerifyUtil::HashCheck(const PkgStreamPtr srcData, const size_t dataLe UPDATER_LAST_WORD(PKG_INVALID_DIGEST, ConvertShaHex(hash).substr(0, INTERCEPT_HASH_LENGTH), ConvertShaHex(sourceDigest).substr(0, INTERCEPT_HASH_LENGTH), fileInfo); + WriteHash(sourceDigest, path); return PKG_INVALID_DIGEST; } diff --git a/services/package/pkg_verify/pkg_verify_util.h b/services/package/pkg_verify/pkg_verify_util.h index 006288f4566efdb89c52e7881dbbf4c196322531..5f546f767af48634290397f905945e3ec2383612 100644 --- a/services/package/pkg_verify/pkg_verify_util.h +++ b/services/package/pkg_verify/pkg_verify_util.h @@ -47,6 +47,10 @@ public: int32_t HashCheck(const PkgStreamPtr srcData, const size_t dataLen, const std::vector &hash, const std::string &path) const; + + std::string GetPkgTime(const std::string &pkgPath) const; + + void WriteHash(std::vector &hash, const std::string &pkgPath) const; }; } // namespace Hpackage #endif