1/* 2 * Copyright (c) 2024-2024 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 16#include "zip_entry_header.h" 17#include "signature_tools_log.h" 18 19namespace OHOS { 20namespace SignatureTools { 21ZipEntryHeader* ZipEntryHeader::GetZipEntryHeader(const std::string& bytes) 22{ 23 ZipEntryHeader* entryHeader = new ZipEntryHeader(); 24 ByteBuffer bf(bytes.c_str(), bytes.size()); 25 26 int32_t entryHeaderInt32Value; 27 bf.GetInt32(entryHeaderInt32Value); 28 if (entryHeaderInt32Value != ZipEntryHeader::SIGNATURE) { 29 delete entryHeader; 30 SIGNATURE_TOOLS_LOGE("find zip entry head failed"); 31 return nullptr; 32 } 33 34 int16_t entryHeaderInt16Value; 35 bf.GetInt16(entryHeaderInt16Value); 36 entryHeader->SetVersion(entryHeaderInt16Value); 37 38 bf.GetInt16(entryHeaderInt16Value); 39 entryHeader->SetFlag(entryHeaderInt16Value); 40 41 bf.GetInt16(entryHeaderInt16Value); 42 entryHeader->SetMethod(entryHeaderInt16Value); 43 44 bf.GetInt16(entryHeaderInt16Value); 45 entryHeader->SetLastTime(entryHeaderInt16Value); 46 47 bf.GetInt16(entryHeaderInt16Value); 48 entryHeader->SetLastDate(entryHeaderInt16Value); 49 50 bf.GetInt32(entryHeaderInt32Value); 51 entryHeader->SetCrc32(entryHeaderInt32Value); 52 53 uint32_t entryHeaderUInt32Value; 54 bf.GetUInt32(entryHeaderUInt32Value); 55 entryHeader->SetCompressedSize(entryHeaderUInt32Value); 56 57 bf.GetUInt32(entryHeaderUInt32Value); 58 entryHeader->SetUnCompressedSize(entryHeaderUInt32Value); 59 60 uint16_t entryHeaderUInt16Value; 61 bf.GetUInt16(entryHeaderUInt16Value); 62 entryHeader->SetFileNameLength(entryHeaderUInt16Value); 63 64 bf.GetUInt16(entryHeaderUInt16Value); 65 entryHeader->SetExtraLength(entryHeaderUInt16Value); 66 67 entryHeader->SetLength(HEADER_LENGTH + entryHeader->GetFileNameLength() + entryHeader->GetExtraLength()); 68 69 return entryHeader; 70} 71 72void ZipEntryHeader::ReadFileName(const std::string& bytes) 73{ 74 ByteBuffer bf(bytes.c_str(), bytes.size()); 75 if (m_fileNameLength > 0) { 76 std::string nameBytes(m_fileNameLength, 0); 77 bf.GetData(&nameBytes[0], m_fileNameLength); 78 m_fileName = nameBytes; 79 } 80} 81 82void ZipEntryHeader::ReadExtra(const std::string& bytes) 83{ 84 ByteBuffer bf(bytes.c_str(), bytes.size()); 85 if (m_extraLength > 0) { 86 std::string extra(m_extraLength, 0); 87 bf.GetData(&extra[0], m_extraLength); 88 m_extraData = extra; 89 } 90} 91 92std::string ZipEntryHeader::ToBytes() 93{ 94 ByteBuffer bf(m_length); 95 96 bf.PutInt32(SIGNATURE); 97 bf.PutInt16(m_version); 98 bf.PutInt16(m_flag); 99 bf.PutInt16(m_method); 100 bf.PutInt16(m_lastTime); 101 bf.PutInt16(m_lastDate); 102 bf.PutInt32(m_crc32); 103 bf.PutUInt32(m_compressedSize); 104 bf.PutUInt32(m_unCompressedSize); 105 bf.PutUInt16(m_fileNameLength); 106 bf.PutUInt16(m_extraLength); 107 108 if (m_fileNameLength > 0) { 109 bf.PutData(m_fileName.c_str(), m_fileName.size()); 110 } 111 if (m_extraLength > 0) { 112 bf.PutData(m_extraData.c_str(), m_extraData.size()); 113 } 114 115 return bf.ToString(); 116} 117 118int ZipEntryHeader::GetHeaderLength() 119{ 120 return HEADER_LENGTH; 121} 122 123int ZipEntryHeader::GetSIGNATURE() 124{ 125 return SIGNATURE; 126} 127 128short ZipEntryHeader::GetVersion() 129{ 130 return m_version; 131} 132 133void ZipEntryHeader::SetVersion(short version) 134{ 135 m_version = version; 136} 137 138short ZipEntryHeader::GetFlag() 139{ 140 return m_flag; 141} 142 143void ZipEntryHeader::SetFlag(short flag) 144{ 145 m_flag = flag; 146} 147 148short ZipEntryHeader::GetMethod() 149{ 150 return m_method; 151} 152 153void ZipEntryHeader::SetMethod(short method) 154{ 155 m_method = method; 156} 157 158short ZipEntryHeader::GetLastTime() 159{ 160 return m_lastTime; 161} 162 163void ZipEntryHeader::SetLastTime(short lastTime) 164{ 165 m_lastTime = lastTime; 166} 167 168short ZipEntryHeader::GetLastDate() 169{ 170 return m_lastDate; 171} 172 173void ZipEntryHeader::SetLastDate(short lastDate) 174{ 175 m_lastDate = lastDate; 176} 177 178int ZipEntryHeader::GetCrc32() 179{ 180 return m_crc32; 181} 182 183void ZipEntryHeader::SetCrc32(int crc32) 184{ 185 m_crc32 = crc32; 186} 187 188uint32_t ZipEntryHeader::GetCompressedSize() 189{ 190 return m_compressedSize; 191} 192 193void ZipEntryHeader::SetCompressedSize(uint32_t compressedSize) 194{ 195 m_compressedSize = compressedSize; 196} 197 198uint32_t ZipEntryHeader::GetUnCompressedSize() 199{ 200 return m_unCompressedSize; 201} 202 203void ZipEntryHeader::SetUnCompressedSize(uint32_t unCompressedSize) 204{ 205 m_unCompressedSize = unCompressedSize; 206} 207 208uint16_t ZipEntryHeader::GetFileNameLength() 209{ 210 return m_fileNameLength; 211} 212 213void ZipEntryHeader::SetFileNameLength(uint16_t fileNameLength) 214{ 215 m_fileNameLength = fileNameLength; 216} 217 218uint16_t ZipEntryHeader::GetExtraLength() 219{ 220 return m_extraLength; 221} 222 223void ZipEntryHeader::SetExtraLength(uint16_t extraLength) 224{ 225 m_extraLength = extraLength; 226} 227 228std::string ZipEntryHeader::GetFileName() const 229{ 230 return m_fileName; 231} 232 233void ZipEntryHeader::SetFileName(const std::string& fileName) 234{ 235 m_fileName = fileName; 236} 237 238std::string ZipEntryHeader::GetExtraData() const 239{ 240 return m_extraData; 241} 242 243void ZipEntryHeader::SetExtraData(const std::string& extraData) 244{ 245 m_extraData = extraData; 246} 247 248uint32_t ZipEntryHeader::GetLength() 249{ 250 return m_length; 251} 252 253void ZipEntryHeader::SetLength(uint32_t length) 254{ 255 m_length = length; 256} 257} // namespace SignatureTools 258} // namespace OHOS