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 <fstream>
17 #include <iostream>
18
19 #include "file_utils.h"
20 #include "signature_tools_log.h"
21 #include "zip_entry_data.h"
22
23 namespace OHOS {
24 namespace SignatureTools {
GetZipEntryHeader()25 ZipEntryHeader* ZipEntryData::GetZipEntryHeader()
26 {
27 return m_zipEntryHeader;
28 }
29
GetZipEntry(std::ifstream & input,uint32_t entryOffset,uint32_t fileSize)30 ZipEntryData* ZipEntryData::GetZipEntry(std::ifstream& input, uint32_t entryOffset, uint32_t fileSize)
31 {
32 uint32_t offset = entryOffset;
33 /* read entry header by file and offset. */
34 std::string headStr;
35 if (FileUtils::ReadInputByOffsetAndLength(input, entryOffset, ZipEntryHeader::HEADER_LENGTH, headStr) != 0) {
36 SIGNATURE_TOOLS_LOGE("read zip entry head failed in file");
37 return nullptr;
38 }
39 ZipEntryHeader* entryHeader = ZipEntryHeader::GetZipEntryHeader(headStr);
40 if (!entryHeader) {
41 return nullptr;
42 }
43 offset += ZipEntryHeader::HEADER_LENGTH;
44
45 /* read entry file name and extra by offset. */
46 if (!ReadEntryFileNameAndExtraByOffset(input, entryHeader, offset)) {
47 return nullptr;
48 }
49 /* skip file data , save file offset and size. */
50 ZipEntryData* entry = new ZipEntryData();
51 entry->SetFileOffset(offset);
52 entry->SetFileSize(fileSize);
53 input.seekg(fileSize, std::ios::cur);
54 int64_t entryLength = entryHeader->GetLength() + fileSize;
55
56 /* set desc null flag */
57 if ((entryHeader->GetFlag() & HAS_DATA_DESCRIPTOR_MASK) != NOT_HAS_DATA_DESCRIPTOR_FLAG) {
58 /* if entry has data descriptor, read entry data descriptor. */
59 std::string retStr;
60 if (FileUtils::ReadInputByLength(input, DataDescriptor::DES_LENGTH, retStr) != 0) {
61 SIGNATURE_TOOLS_LOGE("read entry data descriptor failed in file");
62 return nullptr;
63 }
64 DataDescriptor* dataDesc = DataDescriptor::GetDataDescriptor(retStr);
65 if (!dataDesc) {
66 return nullptr;
67 }
68 entryLength += DataDescriptor::DES_LENGTH;
69 entry->SetDataDescriptor(dataDesc);
70 }
71 entry->SetZipEntryHeader(entryHeader);
72 entry->SetLength(entryLength);
73 return entry;
74 }
75
ReadEntryFileNameAndExtraByOffset(std::ifstream & input,ZipEntryHeader * entryHeader,uint32_t & offset)76 bool ZipEntryData::ReadEntryFileNameAndExtraByOffset(std::ifstream& input, ZipEntryHeader* entryHeader,
77 uint32_t& offset)
78 {
79 if (entryHeader->GetFileNameLength() > 0) {
80 std::string fileNameStr;
81 if (FileUtils::ReadInputByLength(input, entryHeader->GetFileNameLength(), fileNameStr) != 0) {
82 SIGNATURE_TOOLS_LOGE("read entry file name failed in file");
83 return false;
84 }
85 entryHeader->ReadFileName(fileNameStr);
86 offset += entryHeader->GetFileNameLength();
87 }
88 if (entryHeader->GetExtraLength() > 0) {
89 std::string extraStr;
90 if (FileUtils::ReadInputByLength(input, entryHeader->GetExtraLength(), extraStr) != 0) {
91 SIGNATURE_TOOLS_LOGE("read entry file extra failed in file");
92 return false;
93 }
94 entryHeader->ReadExtra(extraStr);
95 offset += entryHeader->GetExtraLength();
96 }
97 return true;
98 }
99
SetZipEntryHeader(ZipEntryHeader * zipEntryHeader)100 void ZipEntryData::SetZipEntryHeader(ZipEntryHeader* zipEntryHeader)
101 {
102 m_zipEntryHeader = zipEntryHeader;
103 }
104
GetDataDescriptor()105 DataDescriptor* ZipEntryData::GetDataDescriptor()
106 {
107 return m_dataDescriptor;
108 }
109
SetDataDescriptor(DataDescriptor * dataDescriptor)110 void ZipEntryData::SetDataDescriptor(DataDescriptor* dataDescriptor)
111 {
112 m_dataDescriptor = dataDescriptor;
113 }
114
GetFileOffset()115 uint32_t ZipEntryData::GetFileOffset()
116 {
117 return m_fileOffset;
118 }
119
SetFileOffset(uint32_t fileOffset)120 void ZipEntryData::SetFileOffset(uint32_t fileOffset)
121 {
122 m_fileOffset = fileOffset;
123 }
124
GetFileSize()125 uint32_t ZipEntryData::GetFileSize()
126 {
127 return m_fileSize;
128 }
129
SetFileSize(uint32_t fileSize)130 void ZipEntryData::SetFileSize(uint32_t fileSize)
131 {
132 m_fileSize = fileSize;
133 }
134
GetLength()135 uint32_t ZipEntryData::GetLength()
136 {
137 return m_length;
138 }
139
SetLength(uint32_t length)140 void ZipEntryData::SetLength(uint32_t length)
141 {
142 m_length = length;
143 }
144 } // namespace SignatureTools
145 } // namespace OHOS