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#include "central_directory.h" 1754aa6d63Sopenharmony_ci#include "signature_tools_log.h" 1854aa6d63Sopenharmony_ci 1954aa6d63Sopenharmony_cinamespace OHOS { 2054aa6d63Sopenharmony_cinamespace SignatureTools { 2154aa6d63Sopenharmony_cibool CentralDirectory::GetCentralDirectory(ByteBuffer& bf, CentralDirectory* cd) 2254aa6d63Sopenharmony_ci{ 2354aa6d63Sopenharmony_ci int signatureValue; 2454aa6d63Sopenharmony_ci bf.GetInt32(signatureValue); 2554aa6d63Sopenharmony_ci if (signatureValue != SIGNATURE) { 2654aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("find zip central directory failed"); 2754aa6d63Sopenharmony_ci return false; 2854aa6d63Sopenharmony_ci } 2954aa6d63Sopenharmony_ci 3054aa6d63Sopenharmony_ci SetCentralDirectoryValues(bf, cd); 3154aa6d63Sopenharmony_ci 3254aa6d63Sopenharmony_ci uint16_t fileNameLength = cd->GetFileNameLength(); 3354aa6d63Sopenharmony_ci if (fileNameLength > 0) { 3454aa6d63Sopenharmony_ci std::string readFileName(fileNameLength, 0); 3554aa6d63Sopenharmony_ci bf.GetData(&readFileName[0], fileNameLength); 3654aa6d63Sopenharmony_ci cd->SetFileName(readFileName); 3754aa6d63Sopenharmony_ci } 3854aa6d63Sopenharmony_ci uint16_t extraLength = cd->GetExtraLength(); 3954aa6d63Sopenharmony_ci if (extraLength > 0) { 4054aa6d63Sopenharmony_ci std::string extra(extraLength, 0); 4154aa6d63Sopenharmony_ci bf.GetData(&extra[0], extraLength); 4254aa6d63Sopenharmony_ci cd->SetExtraData(extra); 4354aa6d63Sopenharmony_ci } 4454aa6d63Sopenharmony_ci uint16_t commentLength = cd->GetCommentLength(); 4554aa6d63Sopenharmony_ci if (commentLength > 0) { 4654aa6d63Sopenharmony_ci std::string readComment(commentLength, 0); 4754aa6d63Sopenharmony_ci bf.GetData(&readComment[0], commentLength); 4854aa6d63Sopenharmony_ci cd->SetComment(readComment); 4954aa6d63Sopenharmony_ci } 5054aa6d63Sopenharmony_ci cd->SetLength(CD_LENGTH + fileNameLength + extraLength + commentLength); 5154aa6d63Sopenharmony_ci 5254aa6d63Sopenharmony_ci return true; 5354aa6d63Sopenharmony_ci} 5454aa6d63Sopenharmony_ci 5554aa6d63Sopenharmony_civoid CentralDirectory::SetCentralDirectoryValues(ByteBuffer& bf, CentralDirectory* cd) 5654aa6d63Sopenharmony_ci{ 5754aa6d63Sopenharmony_ci int16_t centralDirectoryInt16Value; 5854aa6d63Sopenharmony_ci bf.GetInt16(centralDirectoryInt16Value); 5954aa6d63Sopenharmony_ci cd->SetVersion(centralDirectoryInt16Value); 6054aa6d63Sopenharmony_ci 6154aa6d63Sopenharmony_ci bf.GetInt16(centralDirectoryInt16Value); 6254aa6d63Sopenharmony_ci cd->SetVersionExtra(centralDirectoryInt16Value); 6354aa6d63Sopenharmony_ci 6454aa6d63Sopenharmony_ci bf.GetInt16(centralDirectoryInt16Value); 6554aa6d63Sopenharmony_ci cd->SetFlag(centralDirectoryInt16Value); 6654aa6d63Sopenharmony_ci 6754aa6d63Sopenharmony_ci bf.GetInt16(centralDirectoryInt16Value); 6854aa6d63Sopenharmony_ci cd->SetMethod(centralDirectoryInt16Value); 6954aa6d63Sopenharmony_ci 7054aa6d63Sopenharmony_ci bf.GetInt16(centralDirectoryInt16Value); 7154aa6d63Sopenharmony_ci cd->SetLastTime(centralDirectoryInt16Value); 7254aa6d63Sopenharmony_ci 7354aa6d63Sopenharmony_ci bf.GetInt16(centralDirectoryInt16Value); 7454aa6d63Sopenharmony_ci cd->SetLastDate(centralDirectoryInt16Value); 7554aa6d63Sopenharmony_ci 7654aa6d63Sopenharmony_ci int32_t centralDirectoryInt32Value; 7754aa6d63Sopenharmony_ci bf.GetInt32(centralDirectoryInt32Value); 7854aa6d63Sopenharmony_ci cd->SetCrc32(centralDirectoryInt32Value); 7954aa6d63Sopenharmony_ci 8054aa6d63Sopenharmony_ci uint32_t centralDirectoryUInt32Value; 8154aa6d63Sopenharmony_ci bf.GetUInt32(centralDirectoryUInt32Value); 8254aa6d63Sopenharmony_ci cd->SetCompressedSize(centralDirectoryUInt32Value); 8354aa6d63Sopenharmony_ci 8454aa6d63Sopenharmony_ci bf.GetUInt32(centralDirectoryUInt32Value); 8554aa6d63Sopenharmony_ci cd->SetUnCompressedSize(centralDirectoryUInt32Value); 8654aa6d63Sopenharmony_ci 8754aa6d63Sopenharmony_ci uint16_t centralDirectoryUInt16Value; 8854aa6d63Sopenharmony_ci bf.GetUInt16(centralDirectoryUInt16Value); 8954aa6d63Sopenharmony_ci cd->SetFileNameLength(centralDirectoryUInt16Value); 9054aa6d63Sopenharmony_ci 9154aa6d63Sopenharmony_ci bf.GetUInt16(centralDirectoryUInt16Value); 9254aa6d63Sopenharmony_ci cd->SetExtraLength(centralDirectoryUInt16Value); 9354aa6d63Sopenharmony_ci 9454aa6d63Sopenharmony_ci bf.GetUInt16(centralDirectoryUInt16Value); 9554aa6d63Sopenharmony_ci cd->SetCommentLength(centralDirectoryUInt16Value); 9654aa6d63Sopenharmony_ci 9754aa6d63Sopenharmony_ci bf.GetUInt16(centralDirectoryUInt16Value); 9854aa6d63Sopenharmony_ci cd->SetDiskNumStart(centralDirectoryUInt16Value); 9954aa6d63Sopenharmony_ci 10054aa6d63Sopenharmony_ci bf.GetInt16(centralDirectoryInt16Value); 10154aa6d63Sopenharmony_ci cd->SetInternalFile(centralDirectoryInt16Value); 10254aa6d63Sopenharmony_ci 10354aa6d63Sopenharmony_ci bf.GetInt32(centralDirectoryInt32Value); 10454aa6d63Sopenharmony_ci cd->SetExternalFile(centralDirectoryInt32Value); 10554aa6d63Sopenharmony_ci 10654aa6d63Sopenharmony_ci bf.GetUInt32(centralDirectoryUInt32Value); 10754aa6d63Sopenharmony_ci cd->SetOffset(centralDirectoryUInt32Value); 10854aa6d63Sopenharmony_ci} 10954aa6d63Sopenharmony_ci 11054aa6d63Sopenharmony_cistd::string CentralDirectory::ToBytes() 11154aa6d63Sopenharmony_ci{ 11254aa6d63Sopenharmony_ci ByteBuffer bf(m_length); 11354aa6d63Sopenharmony_ci bf.PutInt32(SIGNATURE); 11454aa6d63Sopenharmony_ci bf.PutInt16(m_version); 11554aa6d63Sopenharmony_ci bf.PutInt16(m_versionExtra); 11654aa6d63Sopenharmony_ci bf.PutInt16(m_flag); 11754aa6d63Sopenharmony_ci bf.PutInt16(m_method); 11854aa6d63Sopenharmony_ci bf.PutInt16(m_lastTime); 11954aa6d63Sopenharmony_ci bf.PutInt16(m_lastDate); 12054aa6d63Sopenharmony_ci bf.PutInt32(m_crc32); 12154aa6d63Sopenharmony_ci bf.PutUInt32(m_compressedSize); 12254aa6d63Sopenharmony_ci bf.PutUInt32(m_unCompressedSize); 12354aa6d63Sopenharmony_ci bf.PutUInt16(m_fileNameLength); 12454aa6d63Sopenharmony_ci bf.PutUInt16(m_extraLength); 12554aa6d63Sopenharmony_ci bf.PutUInt16(m_commentLength); 12654aa6d63Sopenharmony_ci bf.PutUInt16(m_diskNumStart); 12754aa6d63Sopenharmony_ci bf.PutInt16(m_internalFile); 12854aa6d63Sopenharmony_ci bf.PutInt32(m_externalFile); 12954aa6d63Sopenharmony_ci bf.PutUInt32(m_offset); 13054aa6d63Sopenharmony_ci 13154aa6d63Sopenharmony_ci if (m_fileNameLength > 0) { 13254aa6d63Sopenharmony_ci bf.PutData(m_fileName.c_str(), m_fileName.size()); 13354aa6d63Sopenharmony_ci } 13454aa6d63Sopenharmony_ci if (m_extraLength > 0) { 13554aa6d63Sopenharmony_ci bf.PutData(m_extraData.c_str(), m_extraData.size()); 13654aa6d63Sopenharmony_ci } 13754aa6d63Sopenharmony_ci if (m_commentLength > 0) { 13854aa6d63Sopenharmony_ci bf.PutData(m_extraData.c_str(), m_extraData.size()); 13954aa6d63Sopenharmony_ci } 14054aa6d63Sopenharmony_ci 14154aa6d63Sopenharmony_ci return bf.ToString(); 14254aa6d63Sopenharmony_ci} 14354aa6d63Sopenharmony_ci 14454aa6d63Sopenharmony_ciint CentralDirectory::GetCdLength() 14554aa6d63Sopenharmony_ci{ 14654aa6d63Sopenharmony_ci return CD_LENGTH; 14754aa6d63Sopenharmony_ci} 14854aa6d63Sopenharmony_ci 14954aa6d63Sopenharmony_ciint CentralDirectory::GetSIGNATURE() 15054aa6d63Sopenharmony_ci{ 15154aa6d63Sopenharmony_ci return SIGNATURE; 15254aa6d63Sopenharmony_ci} 15354aa6d63Sopenharmony_ci 15454aa6d63Sopenharmony_cishort CentralDirectory::GetVersion() 15554aa6d63Sopenharmony_ci{ 15654aa6d63Sopenharmony_ci return m_version; 15754aa6d63Sopenharmony_ci} 15854aa6d63Sopenharmony_ci 15954aa6d63Sopenharmony_civoid CentralDirectory::SetVersion(short version) 16054aa6d63Sopenharmony_ci{ 16154aa6d63Sopenharmony_ci m_version = version; 16254aa6d63Sopenharmony_ci} 16354aa6d63Sopenharmony_ci 16454aa6d63Sopenharmony_cishort CentralDirectory::GetVersionExtra() 16554aa6d63Sopenharmony_ci{ 16654aa6d63Sopenharmony_ci return m_versionExtra; 16754aa6d63Sopenharmony_ci} 16854aa6d63Sopenharmony_ci 16954aa6d63Sopenharmony_civoid CentralDirectory::SetVersionExtra(short versionExtra) 17054aa6d63Sopenharmony_ci{ 17154aa6d63Sopenharmony_ci m_versionExtra = versionExtra; 17254aa6d63Sopenharmony_ci} 17354aa6d63Sopenharmony_ci 17454aa6d63Sopenharmony_cishort CentralDirectory::GetFlag() 17554aa6d63Sopenharmony_ci{ 17654aa6d63Sopenharmony_ci return m_flag; 17754aa6d63Sopenharmony_ci} 17854aa6d63Sopenharmony_ci 17954aa6d63Sopenharmony_civoid CentralDirectory::SetFlag(short flag) 18054aa6d63Sopenharmony_ci{ 18154aa6d63Sopenharmony_ci m_flag = flag; 18254aa6d63Sopenharmony_ci} 18354aa6d63Sopenharmony_ci 18454aa6d63Sopenharmony_cishort CentralDirectory::GetMethod() 18554aa6d63Sopenharmony_ci{ 18654aa6d63Sopenharmony_ci return m_method; 18754aa6d63Sopenharmony_ci} 18854aa6d63Sopenharmony_ci 18954aa6d63Sopenharmony_civoid CentralDirectory::SetMethod(short method) 19054aa6d63Sopenharmony_ci{ 19154aa6d63Sopenharmony_ci m_method = method; 19254aa6d63Sopenharmony_ci} 19354aa6d63Sopenharmony_ci 19454aa6d63Sopenharmony_cishort CentralDirectory::GetLastTime() 19554aa6d63Sopenharmony_ci{ 19654aa6d63Sopenharmony_ci return m_lastTime; 19754aa6d63Sopenharmony_ci} 19854aa6d63Sopenharmony_ci 19954aa6d63Sopenharmony_civoid CentralDirectory::SetLastTime(short lastTime) 20054aa6d63Sopenharmony_ci{ 20154aa6d63Sopenharmony_ci m_lastTime = lastTime; 20254aa6d63Sopenharmony_ci} 20354aa6d63Sopenharmony_ci 20454aa6d63Sopenharmony_cishort CentralDirectory::GetLastDate() 20554aa6d63Sopenharmony_ci{ 20654aa6d63Sopenharmony_ci return m_lastDate; 20754aa6d63Sopenharmony_ci} 20854aa6d63Sopenharmony_ci 20954aa6d63Sopenharmony_civoid CentralDirectory::SetLastDate(short lastDate) 21054aa6d63Sopenharmony_ci{ 21154aa6d63Sopenharmony_ci m_lastDate = lastDate; 21254aa6d63Sopenharmony_ci} 21354aa6d63Sopenharmony_ci 21454aa6d63Sopenharmony_ciint CentralDirectory::GetCrc32() 21554aa6d63Sopenharmony_ci{ 21654aa6d63Sopenharmony_ci return m_crc32; 21754aa6d63Sopenharmony_ci} 21854aa6d63Sopenharmony_ci 21954aa6d63Sopenharmony_civoid CentralDirectory::SetCrc32(int crc32) 22054aa6d63Sopenharmony_ci{ 22154aa6d63Sopenharmony_ci m_crc32 = crc32; 22254aa6d63Sopenharmony_ci} 22354aa6d63Sopenharmony_ci 22454aa6d63Sopenharmony_ciuint32_t CentralDirectory::GetCompressedSize() 22554aa6d63Sopenharmony_ci{ 22654aa6d63Sopenharmony_ci return m_compressedSize; 22754aa6d63Sopenharmony_ci} 22854aa6d63Sopenharmony_ci 22954aa6d63Sopenharmony_civoid CentralDirectory::SetCompressedSize(uint32_t compressedSize) 23054aa6d63Sopenharmony_ci{ 23154aa6d63Sopenharmony_ci m_compressedSize = compressedSize; 23254aa6d63Sopenharmony_ci} 23354aa6d63Sopenharmony_ci 23454aa6d63Sopenharmony_ciuint32_t CentralDirectory::GetUnCompressedSize() 23554aa6d63Sopenharmony_ci{ 23654aa6d63Sopenharmony_ci return m_unCompressedSize; 23754aa6d63Sopenharmony_ci} 23854aa6d63Sopenharmony_ci 23954aa6d63Sopenharmony_civoid CentralDirectory::SetUnCompressedSize(uint32_t unCompressedSize) 24054aa6d63Sopenharmony_ci{ 24154aa6d63Sopenharmony_ci m_unCompressedSize = unCompressedSize; 24254aa6d63Sopenharmony_ci} 24354aa6d63Sopenharmony_ci 24454aa6d63Sopenharmony_ciuint16_t CentralDirectory::GetFileNameLength() 24554aa6d63Sopenharmony_ci{ 24654aa6d63Sopenharmony_ci return m_fileNameLength; 24754aa6d63Sopenharmony_ci} 24854aa6d63Sopenharmony_ci 24954aa6d63Sopenharmony_civoid CentralDirectory::SetFileNameLength(uint16_t fileNameLength) 25054aa6d63Sopenharmony_ci{ 25154aa6d63Sopenharmony_ci m_fileNameLength = fileNameLength; 25254aa6d63Sopenharmony_ci} 25354aa6d63Sopenharmony_ci 25454aa6d63Sopenharmony_ciuint16_t CentralDirectory::GetExtraLength() 25554aa6d63Sopenharmony_ci{ 25654aa6d63Sopenharmony_ci return m_extraLength; 25754aa6d63Sopenharmony_ci} 25854aa6d63Sopenharmony_ci 25954aa6d63Sopenharmony_civoid CentralDirectory::SetExtraLength(uint16_t extraLength) 26054aa6d63Sopenharmony_ci{ 26154aa6d63Sopenharmony_ci m_extraLength = extraLength; 26254aa6d63Sopenharmony_ci} 26354aa6d63Sopenharmony_ci 26454aa6d63Sopenharmony_ciuint16_t CentralDirectory::GetCommentLength() 26554aa6d63Sopenharmony_ci{ 26654aa6d63Sopenharmony_ci return m_commentLength; 26754aa6d63Sopenharmony_ci} 26854aa6d63Sopenharmony_ci 26954aa6d63Sopenharmony_civoid CentralDirectory::SetCommentLength(uint16_t commentLength) 27054aa6d63Sopenharmony_ci{ 27154aa6d63Sopenharmony_ci m_commentLength = commentLength; 27254aa6d63Sopenharmony_ci} 27354aa6d63Sopenharmony_ci 27454aa6d63Sopenharmony_ciuint16_t CentralDirectory::GetDiskNumStart() 27554aa6d63Sopenharmony_ci{ 27654aa6d63Sopenharmony_ci return m_diskNumStart; 27754aa6d63Sopenharmony_ci} 27854aa6d63Sopenharmony_ci 27954aa6d63Sopenharmony_civoid CentralDirectory::SetDiskNumStart(uint16_t diskNumStart) 28054aa6d63Sopenharmony_ci{ 28154aa6d63Sopenharmony_ci m_diskNumStart = diskNumStart; 28254aa6d63Sopenharmony_ci} 28354aa6d63Sopenharmony_ci 28454aa6d63Sopenharmony_cishort CentralDirectory::GetInternalFile() 28554aa6d63Sopenharmony_ci{ 28654aa6d63Sopenharmony_ci return m_internalFile; 28754aa6d63Sopenharmony_ci} 28854aa6d63Sopenharmony_ci 28954aa6d63Sopenharmony_civoid CentralDirectory::SetInternalFile(short internalFile) 29054aa6d63Sopenharmony_ci{ 29154aa6d63Sopenharmony_ci m_internalFile = internalFile; 29254aa6d63Sopenharmony_ci} 29354aa6d63Sopenharmony_ci 29454aa6d63Sopenharmony_ciint CentralDirectory::GetExternalFile() 29554aa6d63Sopenharmony_ci{ 29654aa6d63Sopenharmony_ci return m_externalFile; 29754aa6d63Sopenharmony_ci} 29854aa6d63Sopenharmony_ci 29954aa6d63Sopenharmony_civoid CentralDirectory::SetExternalFile(int externalFile) 30054aa6d63Sopenharmony_ci{ 30154aa6d63Sopenharmony_ci m_externalFile = externalFile; 30254aa6d63Sopenharmony_ci} 30354aa6d63Sopenharmony_ci 30454aa6d63Sopenharmony_ciuint32_t CentralDirectory::GetOffset() 30554aa6d63Sopenharmony_ci{ 30654aa6d63Sopenharmony_ci return m_offset; 30754aa6d63Sopenharmony_ci} 30854aa6d63Sopenharmony_ci 30954aa6d63Sopenharmony_civoid CentralDirectory::SetOffset(uint32_t offset) 31054aa6d63Sopenharmony_ci{ 31154aa6d63Sopenharmony_ci m_offset = offset; 31254aa6d63Sopenharmony_ci} 31354aa6d63Sopenharmony_ci 31454aa6d63Sopenharmony_cistd::string CentralDirectory::GetFileName() 31554aa6d63Sopenharmony_ci{ 31654aa6d63Sopenharmony_ci return m_fileName; 31754aa6d63Sopenharmony_ci} 31854aa6d63Sopenharmony_ci 31954aa6d63Sopenharmony_civoid CentralDirectory::SetFileName(const std::string& fileName) 32054aa6d63Sopenharmony_ci{ 32154aa6d63Sopenharmony_ci m_fileName = fileName; 32254aa6d63Sopenharmony_ci} 32354aa6d63Sopenharmony_ci 32454aa6d63Sopenharmony_cistd::string CentralDirectory::GetExtraData() const 32554aa6d63Sopenharmony_ci{ 32654aa6d63Sopenharmony_ci return m_extraData; 32754aa6d63Sopenharmony_ci} 32854aa6d63Sopenharmony_ci 32954aa6d63Sopenharmony_civoid CentralDirectory::SetExtraData(const std::string& extraData) 33054aa6d63Sopenharmony_ci{ 33154aa6d63Sopenharmony_ci m_extraData = extraData; 33254aa6d63Sopenharmony_ci} 33354aa6d63Sopenharmony_ci 33454aa6d63Sopenharmony_cistd::string CentralDirectory::GetComment() 33554aa6d63Sopenharmony_ci{ 33654aa6d63Sopenharmony_ci return m_comment; 33754aa6d63Sopenharmony_ci} 33854aa6d63Sopenharmony_ci 33954aa6d63Sopenharmony_civoid CentralDirectory::SetComment(const std::string& comment) 34054aa6d63Sopenharmony_ci{ 34154aa6d63Sopenharmony_ci m_comment = comment; 34254aa6d63Sopenharmony_ci} 34354aa6d63Sopenharmony_ci 34454aa6d63Sopenharmony_ciuint32_t CentralDirectory::GetLength() 34554aa6d63Sopenharmony_ci{ 34654aa6d63Sopenharmony_ci return m_length; 34754aa6d63Sopenharmony_ci} 34854aa6d63Sopenharmony_ci 34954aa6d63Sopenharmony_civoid CentralDirectory::SetLength(uint32_t length) 35054aa6d63Sopenharmony_ci{ 35154aa6d63Sopenharmony_ci m_length = length; 35254aa6d63Sopenharmony_ci} 35354aa6d63Sopenharmony_ci} // namespace SignatureTools 35454aa6d63Sopenharmony_ci} // namespace OHOS