/* * Copyright (c) 2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UPDATE_PATCH_H #define UPDATE_PATCH_H #include #include #include "package/pkg_manager.h" #include "openssl/sha.h" namespace UpdatePatch { struct PatchParam { uint8_t* oldBuff; size_t oldSize; uint8_t* patch; size_t patchSize; }; struct PatchBuffer { uint8_t *buffer; size_t start; size_t length; }; using BlockBuffer = Hpackage::PkgBuffer; class UpdatePatchWriter { public: UpdatePatchWriter() = default; virtual ~UpdatePatchWriter() {} virtual int32_t Init() = 0; virtual int32_t Write(size_t start, const BlockBuffer &buffer, size_t len) = 0; virtual int32_t Finish() = 0; }; using UpdatePatchWriterPtr = UpdatePatchWriter *; class UpdateApplyPatch { public: using ImageProcessor = std::function; static int32_t ApplyImagePatch(const PatchParam ¶m, const std::vector &bonusData, ImageProcessor writer, const std::string& expected); static int32_t ApplyImagePatch(const PatchParam ¶m, UpdatePatchWriterPtr writer, const std::vector &bonusData); static bool PreCheck(const PatchParam ¶m, const UpdatePatchWriterPtr writer); static int32_t ApplyBlockPatch(const PatchBuffer &patchInfo, const BlockBuffer &oldInfo, UpdatePatchWriterPtr writer); static int32_t ApplyBlockPatch(const PatchBuffer &patchInfo, const BlockBuffer &oldInfo, ImageProcessor writer, const std::string& expected); static int32_t ApplyBlockPatch(const PatchBuffer &patchInfo, const BlockBuffer &oldInfo, std::vector &newData); static int32_t ApplyBlockPatch(const PatchBuffer &patchInfo, Hpackage::PkgManager::StreamPtr stream, UpdatePatchWriterPtr writer); static int32_t ApplyPatch(const std::string &patchName, const std::string &oldfile, const std::string &newFile); }; class FilePatchWriter : public UpdatePatchWriter { public: FilePatchWriter(const std::string &newFileName) : UpdatePatchWriter(), newFileName_(newFileName) {} ~FilePatchWriter() override {} int32_t Init() override; int32_t Write(size_t start, const BlockBuffer &buffer, size_t len) override; int32_t Finish() override; private: bool init_ { false }; std::string newFileName_; std::ofstream stream_; }; class ImagePatchWriter : public UpdatePatchWriter { public: ImagePatchWriter(UpdateApplyPatch::ImageProcessor writer, const std::string &expected, const std::string &partitionName) : UpdatePatchWriter(), writer_(writer), expected_(expected), partitionName_(partitionName) {} ~ImagePatchWriter() override {} int32_t Init() override; int32_t Write(size_t start, const BlockBuffer &buffer, size_t len) override; int32_t Finish() override; private: bool init_ { false }; SHA256_CTX sha256Ctx_ {}; UpdateApplyPatch::ImageProcessor writer_; std::string expected_; std::string partitionName_; }; } // namespace UpdatePatch #endif // UPDATE_PATCH_H