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 <fstream> 1754aa6d63Sopenharmony_ci#include <iostream> 1854aa6d63Sopenharmony_ci 1954aa6d63Sopenharmony_ci#include "file_utils.h" 2054aa6d63Sopenharmony_ci#include "signature_tools_log.h" 2154aa6d63Sopenharmony_ci#include "zip_entry_data.h" 2254aa6d63Sopenharmony_ci 2354aa6d63Sopenharmony_cinamespace OHOS { 2454aa6d63Sopenharmony_cinamespace SignatureTools { 2554aa6d63Sopenharmony_ciZipEntryHeader* ZipEntryData::GetZipEntryHeader() 2654aa6d63Sopenharmony_ci{ 2754aa6d63Sopenharmony_ci return m_zipEntryHeader; 2854aa6d63Sopenharmony_ci} 2954aa6d63Sopenharmony_ci 3054aa6d63Sopenharmony_ciZipEntryData* ZipEntryData::GetZipEntry(std::ifstream& input, uint32_t entryOffset, uint32_t fileSize) 3154aa6d63Sopenharmony_ci{ 3254aa6d63Sopenharmony_ci uint32_t offset = entryOffset; 3354aa6d63Sopenharmony_ci /* read entry header by file and offset. */ 3454aa6d63Sopenharmony_ci std::string retStr; 3554aa6d63Sopenharmony_ci if (FileUtils::ReadInputByOffsetAndLength(input, entryOffset, ZipEntryHeader::HEADER_LENGTH, retStr) != 0) { 3654aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("read zip entry head failed in file"); 3754aa6d63Sopenharmony_ci return nullptr; 3854aa6d63Sopenharmony_ci } 3954aa6d63Sopenharmony_ci ZipEntryHeader* entryHeader = ZipEntryHeader::GetZipEntryHeader(retStr); 4054aa6d63Sopenharmony_ci if (!entryHeader) { 4154aa6d63Sopenharmony_ci return nullptr; 4254aa6d63Sopenharmony_ci } 4354aa6d63Sopenharmony_ci offset += ZipEntryHeader::HEADER_LENGTH; 4454aa6d63Sopenharmony_ci 4554aa6d63Sopenharmony_ci /* read entry file name and extra by offset. */ 4654aa6d63Sopenharmony_ci if (!ReadEntryFileNameAndExtraByOffset(input, entryHeader, offset)) { 4754aa6d63Sopenharmony_ci return nullptr; 4854aa6d63Sopenharmony_ci } 4954aa6d63Sopenharmony_ci /* skip file data , save file offset and size. */ 5054aa6d63Sopenharmony_ci ZipEntryData* entry = new ZipEntryData(); 5154aa6d63Sopenharmony_ci entry->SetFileOffset(offset); 5254aa6d63Sopenharmony_ci entry->SetFileSize(fileSize); 5354aa6d63Sopenharmony_ci input.seekg(fileSize, std::ios::cur); 5454aa6d63Sopenharmony_ci int64_t entryLength = entryHeader->GetLength() + fileSize; 5554aa6d63Sopenharmony_ci 5654aa6d63Sopenharmony_ci /* set desc null flag */ 5754aa6d63Sopenharmony_ci if ((entryHeader->GetFlag() & HAS_DATA_DESCRIPTOR_MASK) != NOT_HAS_DATA_DESCRIPTOR_FLAG) { 5854aa6d63Sopenharmony_ci /* if entry has data descriptor, read entry data descriptor. */ 5954aa6d63Sopenharmony_ci std::string retStr; 6054aa6d63Sopenharmony_ci if (FileUtils::ReadInputByLength(input, DataDescriptor::DES_LENGTH, retStr) != 0) { 6154aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("read entry data descriptor failed in file"); 6254aa6d63Sopenharmony_ci return nullptr; 6354aa6d63Sopenharmony_ci } 6454aa6d63Sopenharmony_ci DataDescriptor* dataDesc = DataDescriptor::GetDataDescriptor(retStr); 6554aa6d63Sopenharmony_ci if (!dataDesc) { 6654aa6d63Sopenharmony_ci return nullptr; 6754aa6d63Sopenharmony_ci } 6854aa6d63Sopenharmony_ci entryLength += DataDescriptor::DES_LENGTH; 6954aa6d63Sopenharmony_ci entry->SetDataDescriptor(dataDesc); 7054aa6d63Sopenharmony_ci } 7154aa6d63Sopenharmony_ci entry->SetZipEntryHeader(entryHeader); 7254aa6d63Sopenharmony_ci entry->SetLength(entryLength); 7354aa6d63Sopenharmony_ci return entry; 7454aa6d63Sopenharmony_ci} 7554aa6d63Sopenharmony_ci 7654aa6d63Sopenharmony_cibool ZipEntryData::ReadEntryFileNameAndExtraByOffset(std::ifstream& input, ZipEntryHeader* entryHeader, 7754aa6d63Sopenharmony_ci uint32_t& offset) 7854aa6d63Sopenharmony_ci{ 7954aa6d63Sopenharmony_ci if (entryHeader->GetFileNameLength() > 0) { 8054aa6d63Sopenharmony_ci std::string fileNameStr; 8154aa6d63Sopenharmony_ci if (FileUtils::ReadInputByLength(input, entryHeader->GetFileNameLength(), fileNameStr) != 0) { 8254aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("read entry file name failed in file"); 8354aa6d63Sopenharmony_ci return false; 8454aa6d63Sopenharmony_ci } 8554aa6d63Sopenharmony_ci entryHeader->ReadFileName(fileNameStr); 8654aa6d63Sopenharmony_ci offset += entryHeader->GetFileNameLength(); 8754aa6d63Sopenharmony_ci } 8854aa6d63Sopenharmony_ci if (entryHeader->GetExtraLength() > 0) { 8954aa6d63Sopenharmony_ci std::string extraStr; 9054aa6d63Sopenharmony_ci if (FileUtils::ReadInputByLength(input, entryHeader->GetExtraLength(), extraStr) != 0) { 9154aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("read entry file extra failed in file"); 9254aa6d63Sopenharmony_ci return false; 9354aa6d63Sopenharmony_ci } 9454aa6d63Sopenharmony_ci entryHeader->ReadExtra(extraStr); 9554aa6d63Sopenharmony_ci offset += entryHeader->GetExtraLength(); 9654aa6d63Sopenharmony_ci } 9754aa6d63Sopenharmony_ci return true; 9854aa6d63Sopenharmony_ci} 9954aa6d63Sopenharmony_ci 10054aa6d63Sopenharmony_civoid ZipEntryData::SetZipEntryHeader(ZipEntryHeader* zipEntryHeader) 10154aa6d63Sopenharmony_ci{ 10254aa6d63Sopenharmony_ci m_zipEntryHeader = zipEntryHeader; 10354aa6d63Sopenharmony_ci} 10454aa6d63Sopenharmony_ci 10554aa6d63Sopenharmony_ciDataDescriptor* ZipEntryData::GetDataDescriptor() 10654aa6d63Sopenharmony_ci{ 10754aa6d63Sopenharmony_ci return m_dataDescriptor; 10854aa6d63Sopenharmony_ci} 10954aa6d63Sopenharmony_ci 11054aa6d63Sopenharmony_civoid ZipEntryData::SetDataDescriptor(DataDescriptor* dataDescriptor) 11154aa6d63Sopenharmony_ci{ 11254aa6d63Sopenharmony_ci m_dataDescriptor = dataDescriptor; 11354aa6d63Sopenharmony_ci} 11454aa6d63Sopenharmony_ci 11554aa6d63Sopenharmony_ciuint32_t ZipEntryData::GetFileOffset() 11654aa6d63Sopenharmony_ci{ 11754aa6d63Sopenharmony_ci return m_fileOffset; 11854aa6d63Sopenharmony_ci} 11954aa6d63Sopenharmony_ci 12054aa6d63Sopenharmony_civoid ZipEntryData::SetFileOffset(uint32_t fileOffset) 12154aa6d63Sopenharmony_ci{ 12254aa6d63Sopenharmony_ci m_fileOffset = fileOffset; 12354aa6d63Sopenharmony_ci} 12454aa6d63Sopenharmony_ci 12554aa6d63Sopenharmony_ciuint32_t ZipEntryData::GetFileSize() 12654aa6d63Sopenharmony_ci{ 12754aa6d63Sopenharmony_ci return m_fileSize; 12854aa6d63Sopenharmony_ci} 12954aa6d63Sopenharmony_ci 13054aa6d63Sopenharmony_civoid ZipEntryData::SetFileSize(uint32_t fileSize) 13154aa6d63Sopenharmony_ci{ 13254aa6d63Sopenharmony_ci m_fileSize = fileSize; 13354aa6d63Sopenharmony_ci} 13454aa6d63Sopenharmony_ci 13554aa6d63Sopenharmony_ciuint32_t ZipEntryData::GetLength() 13654aa6d63Sopenharmony_ci{ 13754aa6d63Sopenharmony_ci return m_length; 13854aa6d63Sopenharmony_ci} 13954aa6d63Sopenharmony_ci 14054aa6d63Sopenharmony_civoid ZipEntryData::SetLength(uint32_t length) 14154aa6d63Sopenharmony_ci{ 14254aa6d63Sopenharmony_ci m_length = length; 14354aa6d63Sopenharmony_ci} 14454aa6d63Sopenharmony_ci} // namespace SignatureTools 14554aa6d63Sopenharmony_ci} // namespace OHOS