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 "central_directory.h"
17 #include "signature_tools_log.h"
18 
19 namespace OHOS {
20 namespace SignatureTools {
GetCentralDirectory(ByteBuffer& bf, CentralDirectory* cd)21 bool CentralDirectory::GetCentralDirectory(ByteBuffer& bf, CentralDirectory* cd)
22 {
23     int signatureValue;
24     bf.GetInt32(signatureValue);
25     if (signatureValue != SIGNATURE) {
26         SIGNATURE_TOOLS_LOGE("find zip central directory failed");
27         return false;
28     }
29 
30     SetCentralDirectoryValues(bf, cd);
31 
32     uint16_t fileNameLength = cd->GetFileNameLength();
33     if (fileNameLength > 0) {
34         std::string readFileName(fileNameLength, 0);
35         bf.GetData(&readFileName[0], fileNameLength);
36         cd->SetFileName(readFileName);
37     }
38     uint16_t extraLength = cd->GetExtraLength();
39     if (extraLength > 0) {
40         std::string extra(extraLength, 0);
41         bf.GetData(&extra[0], extraLength);
42         cd->SetExtraData(extra);
43     }
44     uint16_t commentLength = cd->GetCommentLength();
45     if (commentLength > 0) {
46         std::string readComment(commentLength, 0);
47         bf.GetData(&readComment[0], commentLength);
48         cd->SetComment(readComment);
49     }
50     cd->SetLength(CD_LENGTH + fileNameLength + extraLength + commentLength);
51 
52     return true;
53 }
54 
SetCentralDirectoryValues(ByteBuffer& bf, CentralDirectory* cd)55 void CentralDirectory::SetCentralDirectoryValues(ByteBuffer& bf, CentralDirectory* cd)
56 {
57     int16_t centralDirectoryInt16Value;
58     bf.GetInt16(centralDirectoryInt16Value);
59     cd->SetVersion(centralDirectoryInt16Value);
60 
61     bf.GetInt16(centralDirectoryInt16Value);
62     cd->SetVersionExtra(centralDirectoryInt16Value);
63 
64     bf.GetInt16(centralDirectoryInt16Value);
65     cd->SetFlag(centralDirectoryInt16Value);
66 
67     bf.GetInt16(centralDirectoryInt16Value);
68     cd->SetMethod(centralDirectoryInt16Value);
69 
70     bf.GetInt16(centralDirectoryInt16Value);
71     cd->SetLastTime(centralDirectoryInt16Value);
72 
73     bf.GetInt16(centralDirectoryInt16Value);
74     cd->SetLastDate(centralDirectoryInt16Value);
75 
76     int32_t centralDirectoryInt32Value;
77     bf.GetInt32(centralDirectoryInt32Value);
78     cd->SetCrc32(centralDirectoryInt32Value);
79 
80     uint32_t centralDirectoryUInt32Value;
81     bf.GetUInt32(centralDirectoryUInt32Value);
82     cd->SetCompressedSize(centralDirectoryUInt32Value);
83 
84     bf.GetUInt32(centralDirectoryUInt32Value);
85     cd->SetUnCompressedSize(centralDirectoryUInt32Value);
86 
87     uint16_t centralDirectoryUInt16Value;
88     bf.GetUInt16(centralDirectoryUInt16Value);
89     cd->SetFileNameLength(centralDirectoryUInt16Value);
90 
91     bf.GetUInt16(centralDirectoryUInt16Value);
92     cd->SetExtraLength(centralDirectoryUInt16Value);
93 
94     bf.GetUInt16(centralDirectoryUInt16Value);
95     cd->SetCommentLength(centralDirectoryUInt16Value);
96 
97     bf.GetUInt16(centralDirectoryUInt16Value);
98     cd->SetDiskNumStart(centralDirectoryUInt16Value);
99 
100     bf.GetInt16(centralDirectoryInt16Value);
101     cd->SetInternalFile(centralDirectoryInt16Value);
102 
103     bf.GetInt32(centralDirectoryInt32Value);
104     cd->SetExternalFile(centralDirectoryInt32Value);
105 
106     bf.GetUInt32(centralDirectoryUInt32Value);
107     cd->SetOffset(centralDirectoryUInt32Value);
108 }
109 
ToBytes()110 std::string CentralDirectory::ToBytes()
111 {
112     ByteBuffer bf(m_length);
113     bf.PutInt32(SIGNATURE);
114     bf.PutInt16(m_version);
115     bf.PutInt16(m_versionExtra);
116     bf.PutInt16(m_flag);
117     bf.PutInt16(m_method);
118     bf.PutInt16(m_lastTime);
119     bf.PutInt16(m_lastDate);
120     bf.PutInt32(m_crc32);
121     bf.PutUInt32(m_compressedSize);
122     bf.PutUInt32(m_unCompressedSize);
123     bf.PutUInt16(m_fileNameLength);
124     bf.PutUInt16(m_extraLength);
125     bf.PutUInt16(m_commentLength);
126     bf.PutUInt16(m_diskNumStart);
127     bf.PutInt16(m_internalFile);
128     bf.PutInt32(m_externalFile);
129     bf.PutUInt32(m_offset);
130 
131     if (m_fileNameLength > 0) {
132         bf.PutData(m_fileName.c_str(), m_fileName.size());
133     }
134     if (m_extraLength > 0) {
135         bf.PutData(m_extraData.c_str(), m_extraData.size());
136     }
137     if (m_commentLength > 0) {
138         bf.PutData(m_extraData.c_str(), m_extraData.size());
139     }
140 
141     return bf.ToString();
142 }
143 
GetCdLength()144 int CentralDirectory::GetCdLength()
145 {
146     return CD_LENGTH;
147 }
148 
GetSIGNATURE()149 int CentralDirectory::GetSIGNATURE()
150 {
151     return SIGNATURE;
152 }
153 
GetVersion()154 short CentralDirectory::GetVersion()
155 {
156     return m_version;
157 }
158 
SetVersion(short version)159 void CentralDirectory::SetVersion(short version)
160 {
161     m_version = version;
162 }
163 
GetVersionExtra()164 short CentralDirectory::GetVersionExtra()
165 {
166     return m_versionExtra;
167 }
168 
SetVersionExtra(short versionExtra)169 void CentralDirectory::SetVersionExtra(short versionExtra)
170 {
171     m_versionExtra = versionExtra;
172 }
173 
GetFlag()174 short CentralDirectory::GetFlag()
175 {
176     return m_flag;
177 }
178 
SetFlag(short flag)179 void CentralDirectory::SetFlag(short flag)
180 {
181     m_flag = flag;
182 }
183 
GetMethod()184 short CentralDirectory::GetMethod()
185 {
186     return m_method;
187 }
188 
SetMethod(short method)189 void CentralDirectory::SetMethod(short method)
190 {
191     m_method = method;
192 }
193 
GetLastTime()194 short CentralDirectory::GetLastTime()
195 {
196     return m_lastTime;
197 }
198 
SetLastTime(short lastTime)199 void CentralDirectory::SetLastTime(short lastTime)
200 {
201     m_lastTime = lastTime;
202 }
203 
GetLastDate()204 short CentralDirectory::GetLastDate()
205 {
206     return m_lastDate;
207 }
208 
SetLastDate(short lastDate)209 void CentralDirectory::SetLastDate(short lastDate)
210 {
211     m_lastDate = lastDate;
212 }
213 
GetCrc32()214 int CentralDirectory::GetCrc32()
215 {
216     return m_crc32;
217 }
218 
SetCrc32(int crc32)219 void CentralDirectory::SetCrc32(int crc32)
220 {
221     m_crc32 = crc32;
222 }
223 
GetCompressedSize()224 uint32_t CentralDirectory::GetCompressedSize()
225 {
226     return m_compressedSize;
227 }
228 
SetCompressedSize(uint32_t compressedSize)229 void CentralDirectory::SetCompressedSize(uint32_t compressedSize)
230 {
231     m_compressedSize = compressedSize;
232 }
233 
GetUnCompressedSize()234 uint32_t CentralDirectory::GetUnCompressedSize()
235 {
236     return m_unCompressedSize;
237 }
238 
SetUnCompressedSize(uint32_t unCompressedSize)239 void CentralDirectory::SetUnCompressedSize(uint32_t unCompressedSize)
240 {
241     m_unCompressedSize = unCompressedSize;
242 }
243 
GetFileNameLength()244 uint16_t CentralDirectory::GetFileNameLength()
245 {
246     return m_fileNameLength;
247 }
248 
SetFileNameLength(uint16_t fileNameLength)249 void CentralDirectory::SetFileNameLength(uint16_t fileNameLength)
250 {
251     m_fileNameLength = fileNameLength;
252 }
253 
GetExtraLength()254 uint16_t CentralDirectory::GetExtraLength()
255 {
256     return m_extraLength;
257 }
258 
SetExtraLength(uint16_t extraLength)259 void CentralDirectory::SetExtraLength(uint16_t extraLength)
260 {
261     m_extraLength = extraLength;
262 }
263 
GetCommentLength()264 uint16_t CentralDirectory::GetCommentLength()
265 {
266     return m_commentLength;
267 }
268 
SetCommentLength(uint16_t commentLength)269 void CentralDirectory::SetCommentLength(uint16_t commentLength)
270 {
271     m_commentLength = commentLength;
272 }
273 
GetDiskNumStart()274 uint16_t CentralDirectory::GetDiskNumStart()
275 {
276     return m_diskNumStart;
277 }
278 
SetDiskNumStart(uint16_t diskNumStart)279 void CentralDirectory::SetDiskNumStart(uint16_t diskNumStart)
280 {
281     m_diskNumStart = diskNumStart;
282 }
283 
GetInternalFile()284 short CentralDirectory::GetInternalFile()
285 {
286     return m_internalFile;
287 }
288 
SetInternalFile(short internalFile)289 void CentralDirectory::SetInternalFile(short internalFile)
290 {
291     m_internalFile = internalFile;
292 }
293 
GetExternalFile()294 int CentralDirectory::GetExternalFile()
295 {
296     return m_externalFile;
297 }
298 
SetExternalFile(int externalFile)299 void CentralDirectory::SetExternalFile(int externalFile)
300 {
301     m_externalFile = externalFile;
302 }
303 
GetOffset()304 uint32_t CentralDirectory::GetOffset()
305 {
306     return m_offset;
307 }
308 
SetOffset(uint32_t offset)309 void CentralDirectory::SetOffset(uint32_t offset)
310 {
311     m_offset = offset;
312 }
313 
GetFileName()314 std::string CentralDirectory::GetFileName()
315 {
316     return m_fileName;
317 }
318 
SetFileName(const std::string& fileName)319 void CentralDirectory::SetFileName(const std::string& fileName)
320 {
321     m_fileName = fileName;
322 }
323 
GetExtraData() const324 std::string CentralDirectory::GetExtraData() const
325 {
326     return m_extraData;
327 }
328 
SetExtraData(const std::string& extraData)329 void CentralDirectory::SetExtraData(const std::string& extraData)
330 {
331     m_extraData = extraData;
332 }
333 
GetComment()334 std::string CentralDirectory::GetComment()
335 {
336     return m_comment;
337 }
338 
SetComment(const std::string& comment)339 void CentralDirectory::SetComment(const std::string& comment)
340 {
341     m_comment = comment;
342 }
343 
GetLength()344 uint32_t CentralDirectory::GetLength()
345 {
346     return m_length;
347 }
348 
SetLength(uint32_t length)349 void CentralDirectory::SetLength(uint32_t length)
350 {
351     m_length = length;
352 }
353 } // namespace SignatureTools
354 } // namespace OHOS