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_CENTRAL_DIRECTORY_H 1754aa6d63Sopenharmony_ci#define SIGNATRUETOOLS_CENTRAL_DIRECTORY_H 1854aa6d63Sopenharmony_ci 1954aa6d63Sopenharmony_ci#include <string> 2054aa6d63Sopenharmony_ci 2154aa6d63Sopenharmony_ci#include "byte_buffer.h" 2254aa6d63Sopenharmony_ci 2354aa6d63Sopenharmony_cinamespace OHOS { 2454aa6d63Sopenharmony_cinamespace SignatureTools { 2554aa6d63Sopenharmony_ci/** 2654aa6d63Sopenharmony_ci * resolve zip CentralDirectory data 2754aa6d63Sopenharmony_ci * CentralDirectory format for: 2854aa6d63Sopenharmony_ci * central file header signature 4 bytes (0x02014b50) 2954aa6d63Sopenharmony_ci * version made by 2 bytes 3054aa6d63Sopenharmony_ci * version needed to extract 2 bytes 3154aa6d63Sopenharmony_ci * general purpose bit flag 2 bytes 3254aa6d63Sopenharmony_ci * compression method 2 bytes 3354aa6d63Sopenharmony_ci * last mod file time 2 bytes 3454aa6d63Sopenharmony_ci * last mod file date 2 bytes 3554aa6d63Sopenharmony_ci * crc-32 4 bytes 3654aa6d63Sopenharmony_ci * compressed size 4 bytes 3754aa6d63Sopenharmony_ci * uncompressed size 4 bytes 3854aa6d63Sopenharmony_ci * file name length 2 bytes 3954aa6d63Sopenharmony_ci * extra field length 2 bytes 4054aa6d63Sopenharmony_ci * file comment length 2 bytes 4154aa6d63Sopenharmony_ci * disk number start 2 bytes 4254aa6d63Sopenharmony_ci * internal file attributes 2 bytes 4354aa6d63Sopenharmony_ci * external file attributes 4 bytes 4454aa6d63Sopenharmony_ci * relative offset of local header 4 bytes 4554aa6d63Sopenharmony_ci * file name (variable size) 4654aa6d63Sopenharmony_ci * extra field (variable size) 4754aa6d63Sopenharmony_ci * file comment (variable size) 4854aa6d63Sopenharmony_ci */ 4954aa6d63Sopenharmony_ciclass CentralDirectory { 5054aa6d63Sopenharmony_cipublic: 5154aa6d63Sopenharmony_ci // central directory invariable bytes length 5254aa6d63Sopenharmony_ci static constexpr int CD_LENGTH = 46; 5354aa6d63Sopenharmony_ci 5454aa6d63Sopenharmony_ci // 4 bytes, central directory signature 5554aa6d63Sopenharmony_ci static constexpr int SIGNATURE = 0x02014b50; 5654aa6d63Sopenharmony_ci 5754aa6d63Sopenharmony_ci static bool GetCentralDirectory(ByteBuffer& bf, CentralDirectory* cd); 5854aa6d63Sopenharmony_ci 5954aa6d63Sopenharmony_ci std::string ToBytes(); 6054aa6d63Sopenharmony_ci 6154aa6d63Sopenharmony_ci static int GetCdLength(); 6254aa6d63Sopenharmony_ci 6354aa6d63Sopenharmony_ci static int GetSIGNATURE(); 6454aa6d63Sopenharmony_ci 6554aa6d63Sopenharmony_ci short GetVersion(); 6654aa6d63Sopenharmony_ci 6754aa6d63Sopenharmony_ci void SetVersion(short version); 6854aa6d63Sopenharmony_ci 6954aa6d63Sopenharmony_ci short GetVersionExtra(); 7054aa6d63Sopenharmony_ci 7154aa6d63Sopenharmony_ci void SetVersionExtra(short versionExtra); 7254aa6d63Sopenharmony_ci 7354aa6d63Sopenharmony_ci short GetMethod(); 7454aa6d63Sopenharmony_ci 7554aa6d63Sopenharmony_ci void SetMethod(short method); 7654aa6d63Sopenharmony_ci 7754aa6d63Sopenharmony_ci short GetFlag(); 7854aa6d63Sopenharmony_ci 7954aa6d63Sopenharmony_ci void SetFlag(short flag); 8054aa6d63Sopenharmony_ci 8154aa6d63Sopenharmony_ci int GetCrc32(); 8254aa6d63Sopenharmony_ci 8354aa6d63Sopenharmony_ci void SetCrc32(int crc32); 8454aa6d63Sopenharmony_ci 8554aa6d63Sopenharmony_ci short GetLastTime(); 8654aa6d63Sopenharmony_ci 8754aa6d63Sopenharmony_ci void SetLastTime(short lastTime); 8854aa6d63Sopenharmony_ci 8954aa6d63Sopenharmony_ci short GetLastDate(); 9054aa6d63Sopenharmony_ci 9154aa6d63Sopenharmony_ci void SetLastDate(short lastDate); 9254aa6d63Sopenharmony_ci 9354aa6d63Sopenharmony_ci uint32_t GetCompressedSize(); 9454aa6d63Sopenharmony_ci 9554aa6d63Sopenharmony_ci void SetCompressedSize(uint32_t compressedSize); 9654aa6d63Sopenharmony_ci 9754aa6d63Sopenharmony_ci uint32_t GetUnCompressedSize(); 9854aa6d63Sopenharmony_ci 9954aa6d63Sopenharmony_ci void SetUnCompressedSize(uint32_t unCompressedSize); 10054aa6d63Sopenharmony_ci 10154aa6d63Sopenharmony_ci uint16_t GetExtraLength(); 10254aa6d63Sopenharmony_ci 10354aa6d63Sopenharmony_ci void SetExtraLength(uint16_t extraLength); 10454aa6d63Sopenharmony_ci 10554aa6d63Sopenharmony_ci uint16_t GetFileNameLength(); 10654aa6d63Sopenharmony_ci 10754aa6d63Sopenharmony_ci void SetFileNameLength(uint16_t fileNameLength); 10854aa6d63Sopenharmony_ci 10954aa6d63Sopenharmony_ci uint16_t GetDiskNumStart(); 11054aa6d63Sopenharmony_ci 11154aa6d63Sopenharmony_ci void SetDiskNumStart(uint16_t diskNumStart); 11254aa6d63Sopenharmony_ci 11354aa6d63Sopenharmony_ci uint16_t GetCommentLength(); 11454aa6d63Sopenharmony_ci 11554aa6d63Sopenharmony_ci void SetCommentLength(uint16_t commentLength); 11654aa6d63Sopenharmony_ci 11754aa6d63Sopenharmony_ci short GetInternalFile(); 11854aa6d63Sopenharmony_ci 11954aa6d63Sopenharmony_ci void SetInternalFile(short internalFile); 12054aa6d63Sopenharmony_ci 12154aa6d63Sopenharmony_ci int GetExternalFile(); 12254aa6d63Sopenharmony_ci 12354aa6d63Sopenharmony_ci void SetExternalFile(int externalFile); 12454aa6d63Sopenharmony_ci 12554aa6d63Sopenharmony_ci uint32_t GetOffset(); 12654aa6d63Sopenharmony_ci 12754aa6d63Sopenharmony_ci void SetOffset(uint32_t offset); 12854aa6d63Sopenharmony_ci 12954aa6d63Sopenharmony_ci std::string GetFileName(); 13054aa6d63Sopenharmony_ci 13154aa6d63Sopenharmony_ci void SetFileName(const std::string& fileName); 13254aa6d63Sopenharmony_ci 13354aa6d63Sopenharmony_ci std::string GetExtraData() const; 13454aa6d63Sopenharmony_ci 13554aa6d63Sopenharmony_ci void SetExtraData(const std::string& extraData); 13654aa6d63Sopenharmony_ci 13754aa6d63Sopenharmony_ci std::string GetComment(); 13854aa6d63Sopenharmony_ci 13954aa6d63Sopenharmony_ci void SetComment(const std::string& comment); 14054aa6d63Sopenharmony_ci 14154aa6d63Sopenharmony_ci uint32_t GetLength(); 14254aa6d63Sopenharmony_ci 14354aa6d63Sopenharmony_ci void SetLength(uint32_t length); 14454aa6d63Sopenharmony_ci 14554aa6d63Sopenharmony_ciprivate: 14654aa6d63Sopenharmony_ci static void SetCentralDirectoryValues(ByteBuffer& bf, CentralDirectory* cd); 14754aa6d63Sopenharmony_ci 14854aa6d63Sopenharmony_ci /* 2 bytes */ 14954aa6d63Sopenharmony_ci short m_version = 0; 15054aa6d63Sopenharmony_ci 15154aa6d63Sopenharmony_ci /* 2 bytes */ 15254aa6d63Sopenharmony_ci short m_versionExtra = 0; 15354aa6d63Sopenharmony_ci 15454aa6d63Sopenharmony_ci /* 2 bytes */ 15554aa6d63Sopenharmony_ci short m_flag = 0; 15654aa6d63Sopenharmony_ci 15754aa6d63Sopenharmony_ci /* 2 bytes */ 15854aa6d63Sopenharmony_ci short m_method = 0; 15954aa6d63Sopenharmony_ci 16054aa6d63Sopenharmony_ci /* 2 bytes */ 16154aa6d63Sopenharmony_ci short m_lastTime = 0; 16254aa6d63Sopenharmony_ci 16354aa6d63Sopenharmony_ci /* 2 bytes */ 16454aa6d63Sopenharmony_ci short m_lastDate = 0; 16554aa6d63Sopenharmony_ci 16654aa6d63Sopenharmony_ci /* 4 bytes */ 16754aa6d63Sopenharmony_ci int m_crc32 = 0; 16854aa6d63Sopenharmony_ci 16954aa6d63Sopenharmony_ci /* 4 bytes */ 17054aa6d63Sopenharmony_ci uint32_t m_compressedSize = 0; 17154aa6d63Sopenharmony_ci 17254aa6d63Sopenharmony_ci /* 4 bytes */ 17354aa6d63Sopenharmony_ci uint32_t m_unCompressedSize = 0; 17454aa6d63Sopenharmony_ci 17554aa6d63Sopenharmony_ci /* 2 bytes */ 17654aa6d63Sopenharmony_ci uint16_t m_fileNameLength = 0; 17754aa6d63Sopenharmony_ci 17854aa6d63Sopenharmony_ci /* 2 bytes */ 17954aa6d63Sopenharmony_ci uint16_t m_extraLength = 0; 18054aa6d63Sopenharmony_ci 18154aa6d63Sopenharmony_ci /* 2 bytes */ 18254aa6d63Sopenharmony_ci uint16_t m_commentLength = 0; 18354aa6d63Sopenharmony_ci 18454aa6d63Sopenharmony_ci /* 2 bytes */ 18554aa6d63Sopenharmony_ci uint16_t m_diskNumStart = 0; 18654aa6d63Sopenharmony_ci 18754aa6d63Sopenharmony_ci /* 2 bytes */ 18854aa6d63Sopenharmony_ci short m_internalFile = 0; 18954aa6d63Sopenharmony_ci 19054aa6d63Sopenharmony_ci /* 4 bytes */ 19154aa6d63Sopenharmony_ci int m_externalFile = 0; 19254aa6d63Sopenharmony_ci 19354aa6d63Sopenharmony_ci /* 4 bytes */ 19454aa6d63Sopenharmony_ci uint32_t m_offset = 0; 19554aa6d63Sopenharmony_ci 19654aa6d63Sopenharmony_ci /* n bytes */ 19754aa6d63Sopenharmony_ci std::string m_fileName; 19854aa6d63Sopenharmony_ci 19954aa6d63Sopenharmony_ci /* n bytes */ 20054aa6d63Sopenharmony_ci std::string m_extraData; 20154aa6d63Sopenharmony_ci 20254aa6d63Sopenharmony_ci /* n bytes */ 20354aa6d63Sopenharmony_ci std::string m_comment; 20454aa6d63Sopenharmony_ci 20554aa6d63Sopenharmony_ci uint32_t m_length = 0; 20654aa6d63Sopenharmony_ci}; 20754aa6d63Sopenharmony_ci} // namespace SignatureTools 20854aa6d63Sopenharmony_ci} // namespace OHOS 20954aa6d63Sopenharmony_ci#endif // SIGNATRUETOOLS_CENTRAL_DIRECTORY_H