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#ifndef SIGNATRUETOOLS_CENTRAL_DIRECTORY_H
1754aa6d63Sopenharmony_ci#define SIGNATRUETOOLS_CENTRAL_DIRECTORY_H
1854aa6d63Sopenharmony_ci
1954aa6d63Sopenharmony_ci#include <string>
2054aa6d63Sopenharmony_ci
2154aa6d63Sopenharmony_ci#include "byte_buffer.h"
2254aa6d63Sopenharmony_ci
2354aa6d63Sopenharmony_cinamespace OHOS {
2454aa6d63Sopenharmony_cinamespace SignatureTools {
2554aa6d63Sopenharmony_ci/**
2654aa6d63Sopenharmony_ci * resolve zip CentralDirectory data
2754aa6d63Sopenharmony_ci * CentralDirectory format for:
2854aa6d63Sopenharmony_ci * central file header signature   4 bytes  (0x02014b50)
2954aa6d63Sopenharmony_ci * version made by                 2 bytes
3054aa6d63Sopenharmony_ci * version needed to extract       2 bytes
3154aa6d63Sopenharmony_ci * general purpose bit flag        2 bytes
3254aa6d63Sopenharmony_ci * compression method              2 bytes
3354aa6d63Sopenharmony_ci * last mod file time              2 bytes
3454aa6d63Sopenharmony_ci * last mod file date              2 bytes
3554aa6d63Sopenharmony_ci * crc-32                          4 bytes
3654aa6d63Sopenharmony_ci * compressed size                 4 bytes
3754aa6d63Sopenharmony_ci * uncompressed size               4 bytes
3854aa6d63Sopenharmony_ci * file name length                2 bytes
3954aa6d63Sopenharmony_ci * extra field length              2 bytes
4054aa6d63Sopenharmony_ci * file comment length             2 bytes
4154aa6d63Sopenharmony_ci * disk number start               2 bytes
4254aa6d63Sopenharmony_ci * internal file attributes        2 bytes
4354aa6d63Sopenharmony_ci * external file attributes        4 bytes
4454aa6d63Sopenharmony_ci * relative offset of local header 4 bytes
4554aa6d63Sopenharmony_ci * file name (variable size)
4654aa6d63Sopenharmony_ci * extra field (variable size)
4754aa6d63Sopenharmony_ci * file comment (variable size)
4854aa6d63Sopenharmony_ci */
4954aa6d63Sopenharmony_ciclass CentralDirectory {
5054aa6d63Sopenharmony_cipublic:
5154aa6d63Sopenharmony_ci    // central directory invariable bytes length
5254aa6d63Sopenharmony_ci    static constexpr int CD_LENGTH = 46;
5354aa6d63Sopenharmony_ci
5454aa6d63Sopenharmony_ci    // 4 bytes, central directory signature
5554aa6d63Sopenharmony_ci    static constexpr int SIGNATURE = 0x02014b50;
5654aa6d63Sopenharmony_ci
5754aa6d63Sopenharmony_ci    static bool GetCentralDirectory(ByteBuffer& bf, CentralDirectory* cd);
5854aa6d63Sopenharmony_ci
5954aa6d63Sopenharmony_ci    std::string ToBytes();
6054aa6d63Sopenharmony_ci
6154aa6d63Sopenharmony_ci    static int GetCdLength();
6254aa6d63Sopenharmony_ci
6354aa6d63Sopenharmony_ci    static int GetSIGNATURE();
6454aa6d63Sopenharmony_ci
6554aa6d63Sopenharmony_ci    short GetVersion();
6654aa6d63Sopenharmony_ci
6754aa6d63Sopenharmony_ci    void SetVersion(short version);
6854aa6d63Sopenharmony_ci
6954aa6d63Sopenharmony_ci    short GetVersionExtra();
7054aa6d63Sopenharmony_ci
7154aa6d63Sopenharmony_ci    void SetVersionExtra(short versionExtra);
7254aa6d63Sopenharmony_ci
7354aa6d63Sopenharmony_ci    short GetMethod();
7454aa6d63Sopenharmony_ci
7554aa6d63Sopenharmony_ci    void SetMethod(short method);
7654aa6d63Sopenharmony_ci
7754aa6d63Sopenharmony_ci    short GetFlag();
7854aa6d63Sopenharmony_ci
7954aa6d63Sopenharmony_ci    void SetFlag(short flag);
8054aa6d63Sopenharmony_ci
8154aa6d63Sopenharmony_ci    int GetCrc32();
8254aa6d63Sopenharmony_ci
8354aa6d63Sopenharmony_ci    void SetCrc32(int crc32);
8454aa6d63Sopenharmony_ci
8554aa6d63Sopenharmony_ci    short GetLastTime();
8654aa6d63Sopenharmony_ci
8754aa6d63Sopenharmony_ci    void SetLastTime(short lastTime);
8854aa6d63Sopenharmony_ci
8954aa6d63Sopenharmony_ci    short GetLastDate();
9054aa6d63Sopenharmony_ci
9154aa6d63Sopenharmony_ci    void SetLastDate(short lastDate);
9254aa6d63Sopenharmony_ci
9354aa6d63Sopenharmony_ci    uint32_t GetCompressedSize();
9454aa6d63Sopenharmony_ci
9554aa6d63Sopenharmony_ci    void SetCompressedSize(uint32_t compressedSize);
9654aa6d63Sopenharmony_ci
9754aa6d63Sopenharmony_ci    uint32_t GetUnCompressedSize();
9854aa6d63Sopenharmony_ci
9954aa6d63Sopenharmony_ci    void SetUnCompressedSize(uint32_t unCompressedSize);
10054aa6d63Sopenharmony_ci
10154aa6d63Sopenharmony_ci    uint16_t GetExtraLength();
10254aa6d63Sopenharmony_ci
10354aa6d63Sopenharmony_ci    void SetExtraLength(uint16_t extraLength);
10454aa6d63Sopenharmony_ci
10554aa6d63Sopenharmony_ci    uint16_t GetFileNameLength();
10654aa6d63Sopenharmony_ci
10754aa6d63Sopenharmony_ci    void SetFileNameLength(uint16_t fileNameLength);
10854aa6d63Sopenharmony_ci
10954aa6d63Sopenharmony_ci    uint16_t GetDiskNumStart();
11054aa6d63Sopenharmony_ci
11154aa6d63Sopenharmony_ci    void SetDiskNumStart(uint16_t diskNumStart);
11254aa6d63Sopenharmony_ci
11354aa6d63Sopenharmony_ci    uint16_t GetCommentLength();
11454aa6d63Sopenharmony_ci
11554aa6d63Sopenharmony_ci    void SetCommentLength(uint16_t commentLength);
11654aa6d63Sopenharmony_ci
11754aa6d63Sopenharmony_ci    short GetInternalFile();
11854aa6d63Sopenharmony_ci
11954aa6d63Sopenharmony_ci    void SetInternalFile(short internalFile);
12054aa6d63Sopenharmony_ci
12154aa6d63Sopenharmony_ci    int GetExternalFile();
12254aa6d63Sopenharmony_ci
12354aa6d63Sopenharmony_ci    void SetExternalFile(int externalFile);
12454aa6d63Sopenharmony_ci
12554aa6d63Sopenharmony_ci    uint32_t GetOffset();
12654aa6d63Sopenharmony_ci
12754aa6d63Sopenharmony_ci    void SetOffset(uint32_t offset);
12854aa6d63Sopenharmony_ci
12954aa6d63Sopenharmony_ci    std::string GetFileName();
13054aa6d63Sopenharmony_ci
13154aa6d63Sopenharmony_ci    void SetFileName(const std::string& fileName);
13254aa6d63Sopenharmony_ci
13354aa6d63Sopenharmony_ci    std::string GetExtraData() const;
13454aa6d63Sopenharmony_ci
13554aa6d63Sopenharmony_ci    void SetExtraData(const std::string& extraData);
13654aa6d63Sopenharmony_ci
13754aa6d63Sopenharmony_ci    std::string GetComment();
13854aa6d63Sopenharmony_ci
13954aa6d63Sopenharmony_ci    void SetComment(const std::string& comment);
14054aa6d63Sopenharmony_ci
14154aa6d63Sopenharmony_ci    uint32_t GetLength();
14254aa6d63Sopenharmony_ci
14354aa6d63Sopenharmony_ci    void SetLength(uint32_t length);
14454aa6d63Sopenharmony_ci
14554aa6d63Sopenharmony_ciprivate:
14654aa6d63Sopenharmony_ci    static void SetCentralDirectoryValues(ByteBuffer& bf, CentralDirectory* cd);
14754aa6d63Sopenharmony_ci
14854aa6d63Sopenharmony_ci    /* 2 bytes */
14954aa6d63Sopenharmony_ci    short m_version = 0;
15054aa6d63Sopenharmony_ci
15154aa6d63Sopenharmony_ci    /* 2 bytes */
15254aa6d63Sopenharmony_ci    short m_versionExtra = 0;
15354aa6d63Sopenharmony_ci
15454aa6d63Sopenharmony_ci    /* 2 bytes */
15554aa6d63Sopenharmony_ci    short m_flag = 0;
15654aa6d63Sopenharmony_ci
15754aa6d63Sopenharmony_ci    /* 2 bytes */
15854aa6d63Sopenharmony_ci    short m_method = 0;
15954aa6d63Sopenharmony_ci
16054aa6d63Sopenharmony_ci    /* 2 bytes */
16154aa6d63Sopenharmony_ci    short m_lastTime = 0;
16254aa6d63Sopenharmony_ci
16354aa6d63Sopenharmony_ci    /* 2 bytes */
16454aa6d63Sopenharmony_ci    short m_lastDate = 0;
16554aa6d63Sopenharmony_ci
16654aa6d63Sopenharmony_ci    /* 4 bytes */
16754aa6d63Sopenharmony_ci    int m_crc32 = 0;
16854aa6d63Sopenharmony_ci
16954aa6d63Sopenharmony_ci    /* 4 bytes */
17054aa6d63Sopenharmony_ci    uint32_t m_compressedSize = 0;
17154aa6d63Sopenharmony_ci
17254aa6d63Sopenharmony_ci    /* 4 bytes */
17354aa6d63Sopenharmony_ci    uint32_t m_unCompressedSize = 0;
17454aa6d63Sopenharmony_ci
17554aa6d63Sopenharmony_ci    /* 2 bytes */
17654aa6d63Sopenharmony_ci    uint16_t m_fileNameLength = 0;
17754aa6d63Sopenharmony_ci
17854aa6d63Sopenharmony_ci    /* 2 bytes */
17954aa6d63Sopenharmony_ci    uint16_t m_extraLength = 0;
18054aa6d63Sopenharmony_ci
18154aa6d63Sopenharmony_ci    /* 2 bytes */
18254aa6d63Sopenharmony_ci    uint16_t m_commentLength = 0;
18354aa6d63Sopenharmony_ci
18454aa6d63Sopenharmony_ci    /* 2 bytes */
18554aa6d63Sopenharmony_ci    uint16_t m_diskNumStart = 0;
18654aa6d63Sopenharmony_ci
18754aa6d63Sopenharmony_ci    /* 2 bytes */
18854aa6d63Sopenharmony_ci    short m_internalFile = 0;
18954aa6d63Sopenharmony_ci
19054aa6d63Sopenharmony_ci    /* 4 bytes */
19154aa6d63Sopenharmony_ci    int m_externalFile = 0;
19254aa6d63Sopenharmony_ci
19354aa6d63Sopenharmony_ci    /* 4 bytes */
19454aa6d63Sopenharmony_ci    uint32_t m_offset = 0;
19554aa6d63Sopenharmony_ci
19654aa6d63Sopenharmony_ci    /* n bytes */
19754aa6d63Sopenharmony_ci    std::string m_fileName;
19854aa6d63Sopenharmony_ci
19954aa6d63Sopenharmony_ci    /* n bytes */
20054aa6d63Sopenharmony_ci    std::string m_extraData;
20154aa6d63Sopenharmony_ci
20254aa6d63Sopenharmony_ci    /* n bytes */
20354aa6d63Sopenharmony_ci    std::string m_comment;
20454aa6d63Sopenharmony_ci
20554aa6d63Sopenharmony_ci    uint32_t m_length = 0;
20654aa6d63Sopenharmony_ci};
20754aa6d63Sopenharmony_ci} // namespace SignatureTools
20854aa6d63Sopenharmony_ci} // namespace OHOS
20954aa6d63Sopenharmony_ci#endif // SIGNATRUETOOLS_CENTRAL_DIRECTORY_H