154aa6d63Sopenharmony_ci/* 254aa6d63Sopenharmony_ci * Copyright (c) 2024-2024 Huawei Device Co., Ltd. 354aa6d63Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 454aa6d63Sopenharmony_ci * you may not use this file except in compliance with the License. 554aa6d63Sopenharmony_ci * You may obtain a copy of the License at 654aa6d63Sopenharmony_ci * 754aa6d63Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 854aa6d63Sopenharmony_ci * 954aa6d63Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1054aa6d63Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1154aa6d63Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1254aa6d63Sopenharmony_ci * See the License for the specific language governing permissions and 1354aa6d63Sopenharmony_ci * limitations under the License. 1454aa6d63Sopenharmony_ci */ 1554aa6d63Sopenharmony_ci 1654aa6d63Sopenharmony_ci#ifndef SIGNATRUETOOLS_ZIP_SIGNER_H 1754aa6d63Sopenharmony_ci#define SIGNATRUETOOLS_ZIP_SIGNER_H 1854aa6d63Sopenharmony_ci 1954aa6d63Sopenharmony_ci#include <fstream> 2054aa6d63Sopenharmony_ci#include <optional> 2154aa6d63Sopenharmony_ci#include <string> 2254aa6d63Sopenharmony_ci#include <vector> 2354aa6d63Sopenharmony_ci 2454aa6d63Sopenharmony_ci#include "endof_central_directory.h" 2554aa6d63Sopenharmony_ci#include "signature_tools_log.h" 2654aa6d63Sopenharmony_ci#include "zip_entry.h" 2754aa6d63Sopenharmony_ci 2854aa6d63Sopenharmony_cinamespace OHOS { 2954aa6d63Sopenharmony_cinamespace SignatureTools { 3054aa6d63Sopenharmony_ciclass ZipSigner { 3154aa6d63Sopenharmony_cipublic: 3254aa6d63Sopenharmony_ci /* file is uncompress file flag */ 3354aa6d63Sopenharmony_ci static constexpr int FILE_UNCOMPRESS_METHOD_FLAG = 0; 3454aa6d63Sopenharmony_ci 3554aa6d63Sopenharmony_ci /* max comment length */ 3654aa6d63Sopenharmony_ci static constexpr int MAX_COMMENT_LENGTH = 65535; 3754aa6d63Sopenharmony_ci 3854aa6d63Sopenharmony_ci ZipSigner() 3954aa6d63Sopenharmony_ci { 4054aa6d63Sopenharmony_ci m_endOfCentralDirectory = nullptr; 4154aa6d63Sopenharmony_ci } 4254aa6d63Sopenharmony_ci 4354aa6d63Sopenharmony_ci ~ZipSigner() 4454aa6d63Sopenharmony_ci { 4554aa6d63Sopenharmony_ci delete m_endOfCentralDirectory; 4654aa6d63Sopenharmony_ci for (auto& zipEntry : m_zipEntries) { 4754aa6d63Sopenharmony_ci delete zipEntry; 4854aa6d63Sopenharmony_ci } 4954aa6d63Sopenharmony_ci } 5054aa6d63Sopenharmony_ci 5154aa6d63Sopenharmony_ci bool Init(std::ifstream& inputFile); 5254aa6d63Sopenharmony_ci 5354aa6d63Sopenharmony_ci /** 5454aa6d63Sopenharmony_ci * output zip to zip file 5554aa6d63Sopenharmony_ci * 5654aa6d63Sopenharmony_ci * @param outFile file path 5754aa6d63Sopenharmony_ci */ 5854aa6d63Sopenharmony_ci bool ToFile(std::ifstream& input, std::ofstream& output); 5954aa6d63Sopenharmony_ci 6054aa6d63Sopenharmony_ci /** 6154aa6d63Sopenharmony_ci * alignment uncompress entry 6254aa6d63Sopenharmony_ci * 6354aa6d63Sopenharmony_ci * @param alignment int alignment 6454aa6d63Sopenharmony_ci */ 6554aa6d63Sopenharmony_ci void Alignment(int alignment); 6654aa6d63Sopenharmony_ci 6754aa6d63Sopenharmony_ci void RemoveSignBlock(); 6854aa6d63Sopenharmony_ci 6954aa6d63Sopenharmony_ci std::vector<ZipEntry*>& GetZipEntries(); 7054aa6d63Sopenharmony_ci 7154aa6d63Sopenharmony_ci void SetZipEntries(const std::vector<ZipEntry*>& zipEntries); 7254aa6d63Sopenharmony_ci 7354aa6d63Sopenharmony_ci uint32_t GetSigningOffset(); 7454aa6d63Sopenharmony_ci 7554aa6d63Sopenharmony_ci void SetSigningOffset(uint32_t signingOffset); 7654aa6d63Sopenharmony_ci 7754aa6d63Sopenharmony_ci std::string GetSigningBlock(); 7854aa6d63Sopenharmony_ci 7954aa6d63Sopenharmony_ci void SetSigningBlock(const std::string& signingBlock); 8054aa6d63Sopenharmony_ci 8154aa6d63Sopenharmony_ci uint32_t GetCDOffset(); 8254aa6d63Sopenharmony_ci 8354aa6d63Sopenharmony_ci void SetCDOffset(uint32_t cDOffset); 8454aa6d63Sopenharmony_ci 8554aa6d63Sopenharmony_ci uint32_t GetEOCDOffset(); 8654aa6d63Sopenharmony_ci 8754aa6d63Sopenharmony_ci void SetEOCDOffset(uint32_t eOCDOffset); 8854aa6d63Sopenharmony_ci 8954aa6d63Sopenharmony_ci EndOfCentralDirectory* GetEndOfCentralDirectory(); 9054aa6d63Sopenharmony_ci 9154aa6d63Sopenharmony_ci void SetEndOfCentralDirectory(EndOfCentralDirectory* endOfCentralDirectory); 9254aa6d63Sopenharmony_ci 9354aa6d63Sopenharmony_ciprivate: 9454aa6d63Sopenharmony_ci EndOfCentralDirectory* GetZipEndOfCentralDirectory(std::ifstream& input); 9554aa6d63Sopenharmony_ci 9654aa6d63Sopenharmony_ci bool GetZipCentralDirectory(std::ifstream& input); 9754aa6d63Sopenharmony_ci 9854aa6d63Sopenharmony_ci std::string GetSigningBlock(std::ifstream& input); 9954aa6d63Sopenharmony_ci 10054aa6d63Sopenharmony_ci bool GetZipEntries(std::ifstream& input); 10154aa6d63Sopenharmony_ci 10254aa6d63Sopenharmony_ci /* sort uncompress entry in the front. */ 10354aa6d63Sopenharmony_ci void Sort(); 10454aa6d63Sopenharmony_ci 10554aa6d63Sopenharmony_ci void ResetOffset(); 10654aa6d63Sopenharmony_ci 10754aa6d63Sopenharmony_ci std::vector<ZipEntry*> m_zipEntries; 10854aa6d63Sopenharmony_ci 10954aa6d63Sopenharmony_ci uint32_t m_signingOffset = 0; 11054aa6d63Sopenharmony_ci 11154aa6d63Sopenharmony_ci std::string m_signingBlock; 11254aa6d63Sopenharmony_ci 11354aa6d63Sopenharmony_ci uint32_t m_cDOffset = 0; 11454aa6d63Sopenharmony_ci 11554aa6d63Sopenharmony_ci uint32_t m_eOCDOffset = 0; 11654aa6d63Sopenharmony_ci 11754aa6d63Sopenharmony_ci EndOfCentralDirectory* m_endOfCentralDirectory; 11854aa6d63Sopenharmony_ci}; 11954aa6d63Sopenharmony_ci} // namespace SignatureTools 12054aa6d63Sopenharmony_ci} // namespace OHOS 12154aa6d63Sopenharmony_ci#endif // SIGNATRUETOOLS_ZIP_SIGNER_H 122