1 /* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 #ifndef UPGRADE_PKG_FILE_H 16 #define UPGRADE_PKG_FILE_H 17 18 #include <map> 19 #include "pkg_algorithm.h" 20 #include "pkg_manager.h" 21 #include "pkg_pkgfile.h" 22 #include "pkg_utils.h" 23 24 namespace hpackage { 25 struct __attribute__((packed)) PkgTlv { 26 uint16_t type; 27 uint16_t length; 28 }; 29 30 struct __attribute__((packed)) UpgradePkgHeader { 31 uint32_t pkgInfoLength; // UpgradePkgTime + UpgradeCompInfo + UPGRADE_RESERVE_LEN 32 uint32_t updateFileVersion; 33 uint8_t productUpdateId[64]; 34 uint8_t softwareVersion[64]; 35 }; 36 37 struct __attribute__((packed)) UpgradePkgTime { 38 uint8_t date[16]; 39 uint8_t time[16]; 40 }; 41 42 struct __attribute__((packed)) UpgradeCompInfo { 43 uint8_t address[16]; // L1 16 44 uint16_t id; 45 uint8_t resType; 46 uint8_t flags; 47 uint8_t type; 48 uint8_t version[10]; 49 uint32_t size; 50 uint32_t originalSize; 51 uint8_t digest[DIGEST_MAX_LEN]; 52 }; 53 54 class UpgradeFileEntry : public PkgEntry { 55 public: UpgradeFileEntry(PkgFilePtr pkgFile,uint32_t nodeId)56 UpgradeFileEntry(PkgFilePtr pkgFile, uint32_t nodeId) : PkgEntry(pkgFile, nodeId) {} 57 ~UpgradeFileEntry()58 ~UpgradeFileEntry() override {} 59 60 int32_t Init(const PkgManager::FileInfoPtr fileInfo, PkgStreamPtr inStream) override; 61 62 int32_t EncodeHeader(PkgStreamPtr inStream, size_t startOffset, size_t &encodeLen) override; 63 64 int32_t Pack(PkgStreamPtr inStream, size_t startOffset, size_t &encodeLen) override; 65 66 int32_t DecodeHeader(const PkgBuffer &buffer, size_t offset, size_t dataOffset, 67 size_t &decodeLen) override; 68 69 int32_t Unpack(PkgStreamPtr outStream) override; 70 GetFileInfo()71 const FileInfo *GetFileInfo() const override 72 { 73 return &fileInfo_.fileInfo; 74 } 75 private: 76 ComponentInfo fileInfo_ {}; 77 }; 78 79 class UpgradePkgFile : public PkgFile { 80 public: UpgradePkgFile(PkgManager::PkgManagerPtr manager,PkgStreamPtr stream,PkgManager::PkgInfoPtr header)81 UpgradePkgFile(PkgManager::PkgManagerPtr manager, PkgStreamPtr stream, PkgManager::PkgInfoPtr header) 82 : PkgFile(manager, stream, PkgFile::PKG_TYPE_UPGRADE) 83 { 84 if (header == nullptr || header->entryCount == 0) { 85 return; 86 } 87 UpgradePkgInfo *info = (UpgradePkgInfo *)(header); 88 pkgInfo_ = std::move(*info); 89 } 90 ~UpgradePkgFile()91 ~UpgradePkgFile() override {} 92 93 int32_t AddEntry(const PkgManager::FileInfoPtr file, const PkgStreamPtr input) override; 94 95 int32_t SavePackage(size_t &signOffset) override; 96 97 int32_t LoadPackage(std::vector<std::string> &fileNames, VerifyFunction verify = nullptr) override; 98 99 size_t GetUpgradeSignatureLen() const; 100 101 size_t GetDigestLen() const; 102 GetPkgInfo()103 const PkgInfo *GetPkgInfo() const override 104 { 105 return &pkgInfo_.pkgInfo; 106 } 107 private: 108 int16_t GetPackageTlvType(); 109 int32_t ReadComponents(const PkgBuffer &buffer, size_t &parsedLen, 110 DigestAlgorithm::DigestAlgorithmPtr algorithm, std::vector<std::string> &fileNames); 111 112 int32_t ReadUpgradePkgHeader(const PkgBuffer &buffer, size_t &realLen, 113 DigestAlgorithm::DigestAlgorithmPtr &algorithm); 114 115 int32_t Verify(size_t start, DigestAlgorithm::DigestAlgorithmPtr algorithm, 116 VerifyFunction verifier, const std::vector<uint8_t> &signData); 117 private: 118 UpgradePkgInfo pkgInfo_ {}; 119 size_t packedFileSize_ {0}; 120 }; 121 } // namespace hpackage 122 #endif 123