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#ifndef SIGNATRUETOOLS_CENTRAL_DIRECTORY_H
17#define SIGNATRUETOOLS_CENTRAL_DIRECTORY_H
18
19#include <string>
20
21#include "byte_buffer.h"
22
23namespace OHOS {
24namespace SignatureTools {
25/**
26 * resolve zip CentralDirectory data
27 * CentralDirectory format for:
28 * central file header signature   4 bytes  (0x02014b50)
29 * version made by                 2 bytes
30 * version needed to extract       2 bytes
31 * general purpose bit flag        2 bytes
32 * compression method              2 bytes
33 * last mod file time              2 bytes
34 * last mod file date              2 bytes
35 * crc-32                          4 bytes
36 * compressed size                 4 bytes
37 * uncompressed size               4 bytes
38 * file name length                2 bytes
39 * extra field length              2 bytes
40 * file comment length             2 bytes
41 * disk number start               2 bytes
42 * internal file attributes        2 bytes
43 * external file attributes        4 bytes
44 * relative offset of local header 4 bytes
45 * file name (variable size)
46 * extra field (variable size)
47 * file comment (variable size)
48 */
49class CentralDirectory {
50public:
51    // central directory invariable bytes length
52    static constexpr int CD_LENGTH = 46;
53
54    // 4 bytes, central directory signature
55    static constexpr int SIGNATURE = 0x02014b50;
56
57    static bool GetCentralDirectory(ByteBuffer& bf, CentralDirectory* cd);
58
59    std::string ToBytes();
60
61    static int GetCdLength();
62
63    static int GetSIGNATURE();
64
65    short GetVersion();
66
67    void SetVersion(short version);
68
69    short GetVersionExtra();
70
71    void SetVersionExtra(short versionExtra);
72
73    short GetMethod();
74
75    void SetMethod(short method);
76
77    short GetFlag();
78
79    void SetFlag(short flag);
80
81    int GetCrc32();
82
83    void SetCrc32(int crc32);
84
85    short GetLastTime();
86
87    void SetLastTime(short lastTime);
88
89    short GetLastDate();
90
91    void SetLastDate(short lastDate);
92
93    uint32_t GetCompressedSize();
94
95    void SetCompressedSize(uint32_t compressedSize);
96
97    uint32_t GetUnCompressedSize();
98
99    void SetUnCompressedSize(uint32_t unCompressedSize);
100
101    uint16_t GetExtraLength();
102
103    void SetExtraLength(uint16_t extraLength);
104
105    uint16_t GetFileNameLength();
106
107    void SetFileNameLength(uint16_t fileNameLength);
108
109    uint16_t GetDiskNumStart();
110
111    void SetDiskNumStart(uint16_t diskNumStart);
112
113    uint16_t GetCommentLength();
114
115    void SetCommentLength(uint16_t commentLength);
116
117    short GetInternalFile();
118
119    void SetInternalFile(short internalFile);
120
121    int GetExternalFile();
122
123    void SetExternalFile(int externalFile);
124
125    uint32_t GetOffset();
126
127    void SetOffset(uint32_t offset);
128
129    std::string GetFileName();
130
131    void SetFileName(const std::string& fileName);
132
133    std::string GetExtraData() const;
134
135    void SetExtraData(const std::string& extraData);
136
137    std::string GetComment();
138
139    void SetComment(const std::string& comment);
140
141    uint32_t GetLength();
142
143    void SetLength(uint32_t length);
144
145private:
146    static void SetCentralDirectoryValues(ByteBuffer& bf, CentralDirectory* cd);
147
148    /* 2 bytes */
149    short m_version = 0;
150
151    /* 2 bytes */
152    short m_versionExtra = 0;
153
154    /* 2 bytes */
155    short m_flag = 0;
156
157    /* 2 bytes */
158    short m_method = 0;
159
160    /* 2 bytes */
161    short m_lastTime = 0;
162
163    /* 2 bytes */
164    short m_lastDate = 0;
165
166    /* 4 bytes */
167    int m_crc32 = 0;
168
169    /* 4 bytes */
170    uint32_t m_compressedSize = 0;
171
172    /* 4 bytes */
173    uint32_t m_unCompressedSize = 0;
174
175    /* 2 bytes */
176    uint16_t m_fileNameLength = 0;
177
178    /* 2 bytes */
179    uint16_t m_extraLength = 0;
180
181    /* 2 bytes */
182    uint16_t m_commentLength = 0;
183
184    /* 2 bytes */
185    uint16_t m_diskNumStart = 0;
186
187    /* 2 bytes */
188    short m_internalFile = 0;
189
190    /* 4 bytes */
191    int m_externalFile = 0;
192
193    /* 4 bytes */
194    uint32_t m_offset = 0;
195
196    /* n bytes */
197    std::string m_fileName;
198
199    /* n bytes */
200    std::string m_extraData;
201
202    /* n bytes */
203    std::string m_comment;
204
205    uint32_t m_length = 0;
206};
207} // namespace SignatureTools
208} // namespace OHOS
209#endif // SIGNATRUETOOLS_CENTRAL_DIRECTORY_H