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 "central_directory.h"
1754aa6d63Sopenharmony_ci#include "signature_tools_log.h"
1854aa6d63Sopenharmony_ci
1954aa6d63Sopenharmony_cinamespace OHOS {
2054aa6d63Sopenharmony_cinamespace SignatureTools {
2154aa6d63Sopenharmony_cibool CentralDirectory::GetCentralDirectory(ByteBuffer& bf, CentralDirectory* cd)
2254aa6d63Sopenharmony_ci{
2354aa6d63Sopenharmony_ci    int signatureValue;
2454aa6d63Sopenharmony_ci    bf.GetInt32(signatureValue);
2554aa6d63Sopenharmony_ci    if (signatureValue != SIGNATURE) {
2654aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("find zip central directory failed");
2754aa6d63Sopenharmony_ci        return false;
2854aa6d63Sopenharmony_ci    }
2954aa6d63Sopenharmony_ci
3054aa6d63Sopenharmony_ci    SetCentralDirectoryValues(bf, cd);
3154aa6d63Sopenharmony_ci
3254aa6d63Sopenharmony_ci    uint16_t fileNameLength = cd->GetFileNameLength();
3354aa6d63Sopenharmony_ci    if (fileNameLength > 0) {
3454aa6d63Sopenharmony_ci        std::string readFileName(fileNameLength, 0);
3554aa6d63Sopenharmony_ci        bf.GetData(&readFileName[0], fileNameLength);
3654aa6d63Sopenharmony_ci        cd->SetFileName(readFileName);
3754aa6d63Sopenharmony_ci    }
3854aa6d63Sopenharmony_ci    uint16_t extraLength = cd->GetExtraLength();
3954aa6d63Sopenharmony_ci    if (extraLength > 0) {
4054aa6d63Sopenharmony_ci        std::string extra(extraLength, 0);
4154aa6d63Sopenharmony_ci        bf.GetData(&extra[0], extraLength);
4254aa6d63Sopenharmony_ci        cd->SetExtraData(extra);
4354aa6d63Sopenharmony_ci    }
4454aa6d63Sopenharmony_ci    uint16_t commentLength = cd->GetCommentLength();
4554aa6d63Sopenharmony_ci    if (commentLength > 0) {
4654aa6d63Sopenharmony_ci        std::string readComment(commentLength, 0);
4754aa6d63Sopenharmony_ci        bf.GetData(&readComment[0], commentLength);
4854aa6d63Sopenharmony_ci        cd->SetComment(readComment);
4954aa6d63Sopenharmony_ci    }
5054aa6d63Sopenharmony_ci    cd->SetLength(CD_LENGTH + fileNameLength + extraLength + commentLength);
5154aa6d63Sopenharmony_ci
5254aa6d63Sopenharmony_ci    return true;
5354aa6d63Sopenharmony_ci}
5454aa6d63Sopenharmony_ci
5554aa6d63Sopenharmony_civoid CentralDirectory::SetCentralDirectoryValues(ByteBuffer& bf, CentralDirectory* cd)
5654aa6d63Sopenharmony_ci{
5754aa6d63Sopenharmony_ci    int16_t centralDirectoryInt16Value;
5854aa6d63Sopenharmony_ci    bf.GetInt16(centralDirectoryInt16Value);
5954aa6d63Sopenharmony_ci    cd->SetVersion(centralDirectoryInt16Value);
6054aa6d63Sopenharmony_ci
6154aa6d63Sopenharmony_ci    bf.GetInt16(centralDirectoryInt16Value);
6254aa6d63Sopenharmony_ci    cd->SetVersionExtra(centralDirectoryInt16Value);
6354aa6d63Sopenharmony_ci
6454aa6d63Sopenharmony_ci    bf.GetInt16(centralDirectoryInt16Value);
6554aa6d63Sopenharmony_ci    cd->SetFlag(centralDirectoryInt16Value);
6654aa6d63Sopenharmony_ci
6754aa6d63Sopenharmony_ci    bf.GetInt16(centralDirectoryInt16Value);
6854aa6d63Sopenharmony_ci    cd->SetMethod(centralDirectoryInt16Value);
6954aa6d63Sopenharmony_ci
7054aa6d63Sopenharmony_ci    bf.GetInt16(centralDirectoryInt16Value);
7154aa6d63Sopenharmony_ci    cd->SetLastTime(centralDirectoryInt16Value);
7254aa6d63Sopenharmony_ci
7354aa6d63Sopenharmony_ci    bf.GetInt16(centralDirectoryInt16Value);
7454aa6d63Sopenharmony_ci    cd->SetLastDate(centralDirectoryInt16Value);
7554aa6d63Sopenharmony_ci
7654aa6d63Sopenharmony_ci    int32_t centralDirectoryInt32Value;
7754aa6d63Sopenharmony_ci    bf.GetInt32(centralDirectoryInt32Value);
7854aa6d63Sopenharmony_ci    cd->SetCrc32(centralDirectoryInt32Value);
7954aa6d63Sopenharmony_ci
8054aa6d63Sopenharmony_ci    uint32_t centralDirectoryUInt32Value;
8154aa6d63Sopenharmony_ci    bf.GetUInt32(centralDirectoryUInt32Value);
8254aa6d63Sopenharmony_ci    cd->SetCompressedSize(centralDirectoryUInt32Value);
8354aa6d63Sopenharmony_ci
8454aa6d63Sopenharmony_ci    bf.GetUInt32(centralDirectoryUInt32Value);
8554aa6d63Sopenharmony_ci    cd->SetUnCompressedSize(centralDirectoryUInt32Value);
8654aa6d63Sopenharmony_ci
8754aa6d63Sopenharmony_ci    uint16_t centralDirectoryUInt16Value;
8854aa6d63Sopenharmony_ci    bf.GetUInt16(centralDirectoryUInt16Value);
8954aa6d63Sopenharmony_ci    cd->SetFileNameLength(centralDirectoryUInt16Value);
9054aa6d63Sopenharmony_ci
9154aa6d63Sopenharmony_ci    bf.GetUInt16(centralDirectoryUInt16Value);
9254aa6d63Sopenharmony_ci    cd->SetExtraLength(centralDirectoryUInt16Value);
9354aa6d63Sopenharmony_ci
9454aa6d63Sopenharmony_ci    bf.GetUInt16(centralDirectoryUInt16Value);
9554aa6d63Sopenharmony_ci    cd->SetCommentLength(centralDirectoryUInt16Value);
9654aa6d63Sopenharmony_ci
9754aa6d63Sopenharmony_ci    bf.GetUInt16(centralDirectoryUInt16Value);
9854aa6d63Sopenharmony_ci    cd->SetDiskNumStart(centralDirectoryUInt16Value);
9954aa6d63Sopenharmony_ci
10054aa6d63Sopenharmony_ci    bf.GetInt16(centralDirectoryInt16Value);
10154aa6d63Sopenharmony_ci    cd->SetInternalFile(centralDirectoryInt16Value);
10254aa6d63Sopenharmony_ci
10354aa6d63Sopenharmony_ci    bf.GetInt32(centralDirectoryInt32Value);
10454aa6d63Sopenharmony_ci    cd->SetExternalFile(centralDirectoryInt32Value);
10554aa6d63Sopenharmony_ci
10654aa6d63Sopenharmony_ci    bf.GetUInt32(centralDirectoryUInt32Value);
10754aa6d63Sopenharmony_ci    cd->SetOffset(centralDirectoryUInt32Value);
10854aa6d63Sopenharmony_ci}
10954aa6d63Sopenharmony_ci
11054aa6d63Sopenharmony_cistd::string CentralDirectory::ToBytes()
11154aa6d63Sopenharmony_ci{
11254aa6d63Sopenharmony_ci    ByteBuffer bf(m_length);
11354aa6d63Sopenharmony_ci    bf.PutInt32(SIGNATURE);
11454aa6d63Sopenharmony_ci    bf.PutInt16(m_version);
11554aa6d63Sopenharmony_ci    bf.PutInt16(m_versionExtra);
11654aa6d63Sopenharmony_ci    bf.PutInt16(m_flag);
11754aa6d63Sopenharmony_ci    bf.PutInt16(m_method);
11854aa6d63Sopenharmony_ci    bf.PutInt16(m_lastTime);
11954aa6d63Sopenharmony_ci    bf.PutInt16(m_lastDate);
12054aa6d63Sopenharmony_ci    bf.PutInt32(m_crc32);
12154aa6d63Sopenharmony_ci    bf.PutUInt32(m_compressedSize);
12254aa6d63Sopenharmony_ci    bf.PutUInt32(m_unCompressedSize);
12354aa6d63Sopenharmony_ci    bf.PutUInt16(m_fileNameLength);
12454aa6d63Sopenharmony_ci    bf.PutUInt16(m_extraLength);
12554aa6d63Sopenharmony_ci    bf.PutUInt16(m_commentLength);
12654aa6d63Sopenharmony_ci    bf.PutUInt16(m_diskNumStart);
12754aa6d63Sopenharmony_ci    bf.PutInt16(m_internalFile);
12854aa6d63Sopenharmony_ci    bf.PutInt32(m_externalFile);
12954aa6d63Sopenharmony_ci    bf.PutUInt32(m_offset);
13054aa6d63Sopenharmony_ci
13154aa6d63Sopenharmony_ci    if (m_fileNameLength > 0) {
13254aa6d63Sopenharmony_ci        bf.PutData(m_fileName.c_str(), m_fileName.size());
13354aa6d63Sopenharmony_ci    }
13454aa6d63Sopenharmony_ci    if (m_extraLength > 0) {
13554aa6d63Sopenharmony_ci        bf.PutData(m_extraData.c_str(), m_extraData.size());
13654aa6d63Sopenharmony_ci    }
13754aa6d63Sopenharmony_ci    if (m_commentLength > 0) {
13854aa6d63Sopenharmony_ci        bf.PutData(m_extraData.c_str(), m_extraData.size());
13954aa6d63Sopenharmony_ci    }
14054aa6d63Sopenharmony_ci
14154aa6d63Sopenharmony_ci    return bf.ToString();
14254aa6d63Sopenharmony_ci}
14354aa6d63Sopenharmony_ci
14454aa6d63Sopenharmony_ciint CentralDirectory::GetCdLength()
14554aa6d63Sopenharmony_ci{
14654aa6d63Sopenharmony_ci    return CD_LENGTH;
14754aa6d63Sopenharmony_ci}
14854aa6d63Sopenharmony_ci
14954aa6d63Sopenharmony_ciint CentralDirectory::GetSIGNATURE()
15054aa6d63Sopenharmony_ci{
15154aa6d63Sopenharmony_ci    return SIGNATURE;
15254aa6d63Sopenharmony_ci}
15354aa6d63Sopenharmony_ci
15454aa6d63Sopenharmony_cishort CentralDirectory::GetVersion()
15554aa6d63Sopenharmony_ci{
15654aa6d63Sopenharmony_ci    return m_version;
15754aa6d63Sopenharmony_ci}
15854aa6d63Sopenharmony_ci
15954aa6d63Sopenharmony_civoid CentralDirectory::SetVersion(short version)
16054aa6d63Sopenharmony_ci{
16154aa6d63Sopenharmony_ci    m_version = version;
16254aa6d63Sopenharmony_ci}
16354aa6d63Sopenharmony_ci
16454aa6d63Sopenharmony_cishort CentralDirectory::GetVersionExtra()
16554aa6d63Sopenharmony_ci{
16654aa6d63Sopenharmony_ci    return m_versionExtra;
16754aa6d63Sopenharmony_ci}
16854aa6d63Sopenharmony_ci
16954aa6d63Sopenharmony_civoid CentralDirectory::SetVersionExtra(short versionExtra)
17054aa6d63Sopenharmony_ci{
17154aa6d63Sopenharmony_ci    m_versionExtra = versionExtra;
17254aa6d63Sopenharmony_ci}
17354aa6d63Sopenharmony_ci
17454aa6d63Sopenharmony_cishort CentralDirectory::GetFlag()
17554aa6d63Sopenharmony_ci{
17654aa6d63Sopenharmony_ci    return m_flag;
17754aa6d63Sopenharmony_ci}
17854aa6d63Sopenharmony_ci
17954aa6d63Sopenharmony_civoid CentralDirectory::SetFlag(short flag)
18054aa6d63Sopenharmony_ci{
18154aa6d63Sopenharmony_ci    m_flag = flag;
18254aa6d63Sopenharmony_ci}
18354aa6d63Sopenharmony_ci
18454aa6d63Sopenharmony_cishort CentralDirectory::GetMethod()
18554aa6d63Sopenharmony_ci{
18654aa6d63Sopenharmony_ci    return m_method;
18754aa6d63Sopenharmony_ci}
18854aa6d63Sopenharmony_ci
18954aa6d63Sopenharmony_civoid CentralDirectory::SetMethod(short method)
19054aa6d63Sopenharmony_ci{
19154aa6d63Sopenharmony_ci    m_method = method;
19254aa6d63Sopenharmony_ci}
19354aa6d63Sopenharmony_ci
19454aa6d63Sopenharmony_cishort CentralDirectory::GetLastTime()
19554aa6d63Sopenharmony_ci{
19654aa6d63Sopenharmony_ci    return m_lastTime;
19754aa6d63Sopenharmony_ci}
19854aa6d63Sopenharmony_ci
19954aa6d63Sopenharmony_civoid CentralDirectory::SetLastTime(short lastTime)
20054aa6d63Sopenharmony_ci{
20154aa6d63Sopenharmony_ci    m_lastTime = lastTime;
20254aa6d63Sopenharmony_ci}
20354aa6d63Sopenharmony_ci
20454aa6d63Sopenharmony_cishort CentralDirectory::GetLastDate()
20554aa6d63Sopenharmony_ci{
20654aa6d63Sopenharmony_ci    return m_lastDate;
20754aa6d63Sopenharmony_ci}
20854aa6d63Sopenharmony_ci
20954aa6d63Sopenharmony_civoid CentralDirectory::SetLastDate(short lastDate)
21054aa6d63Sopenharmony_ci{
21154aa6d63Sopenharmony_ci    m_lastDate = lastDate;
21254aa6d63Sopenharmony_ci}
21354aa6d63Sopenharmony_ci
21454aa6d63Sopenharmony_ciint CentralDirectory::GetCrc32()
21554aa6d63Sopenharmony_ci{
21654aa6d63Sopenharmony_ci    return m_crc32;
21754aa6d63Sopenharmony_ci}
21854aa6d63Sopenharmony_ci
21954aa6d63Sopenharmony_civoid CentralDirectory::SetCrc32(int crc32)
22054aa6d63Sopenharmony_ci{
22154aa6d63Sopenharmony_ci    m_crc32 = crc32;
22254aa6d63Sopenharmony_ci}
22354aa6d63Sopenharmony_ci
22454aa6d63Sopenharmony_ciuint32_t CentralDirectory::GetCompressedSize()
22554aa6d63Sopenharmony_ci{
22654aa6d63Sopenharmony_ci    return m_compressedSize;
22754aa6d63Sopenharmony_ci}
22854aa6d63Sopenharmony_ci
22954aa6d63Sopenharmony_civoid CentralDirectory::SetCompressedSize(uint32_t compressedSize)
23054aa6d63Sopenharmony_ci{
23154aa6d63Sopenharmony_ci    m_compressedSize = compressedSize;
23254aa6d63Sopenharmony_ci}
23354aa6d63Sopenharmony_ci
23454aa6d63Sopenharmony_ciuint32_t CentralDirectory::GetUnCompressedSize()
23554aa6d63Sopenharmony_ci{
23654aa6d63Sopenharmony_ci    return m_unCompressedSize;
23754aa6d63Sopenharmony_ci}
23854aa6d63Sopenharmony_ci
23954aa6d63Sopenharmony_civoid CentralDirectory::SetUnCompressedSize(uint32_t unCompressedSize)
24054aa6d63Sopenharmony_ci{
24154aa6d63Sopenharmony_ci    m_unCompressedSize = unCompressedSize;
24254aa6d63Sopenharmony_ci}
24354aa6d63Sopenharmony_ci
24454aa6d63Sopenharmony_ciuint16_t CentralDirectory::GetFileNameLength()
24554aa6d63Sopenharmony_ci{
24654aa6d63Sopenharmony_ci    return m_fileNameLength;
24754aa6d63Sopenharmony_ci}
24854aa6d63Sopenharmony_ci
24954aa6d63Sopenharmony_civoid CentralDirectory::SetFileNameLength(uint16_t fileNameLength)
25054aa6d63Sopenharmony_ci{
25154aa6d63Sopenharmony_ci    m_fileNameLength = fileNameLength;
25254aa6d63Sopenharmony_ci}
25354aa6d63Sopenharmony_ci
25454aa6d63Sopenharmony_ciuint16_t CentralDirectory::GetExtraLength()
25554aa6d63Sopenharmony_ci{
25654aa6d63Sopenharmony_ci    return m_extraLength;
25754aa6d63Sopenharmony_ci}
25854aa6d63Sopenharmony_ci
25954aa6d63Sopenharmony_civoid CentralDirectory::SetExtraLength(uint16_t extraLength)
26054aa6d63Sopenharmony_ci{
26154aa6d63Sopenharmony_ci    m_extraLength = extraLength;
26254aa6d63Sopenharmony_ci}
26354aa6d63Sopenharmony_ci
26454aa6d63Sopenharmony_ciuint16_t CentralDirectory::GetCommentLength()
26554aa6d63Sopenharmony_ci{
26654aa6d63Sopenharmony_ci    return m_commentLength;
26754aa6d63Sopenharmony_ci}
26854aa6d63Sopenharmony_ci
26954aa6d63Sopenharmony_civoid CentralDirectory::SetCommentLength(uint16_t commentLength)
27054aa6d63Sopenharmony_ci{
27154aa6d63Sopenharmony_ci    m_commentLength = commentLength;
27254aa6d63Sopenharmony_ci}
27354aa6d63Sopenharmony_ci
27454aa6d63Sopenharmony_ciuint16_t CentralDirectory::GetDiskNumStart()
27554aa6d63Sopenharmony_ci{
27654aa6d63Sopenharmony_ci    return m_diskNumStart;
27754aa6d63Sopenharmony_ci}
27854aa6d63Sopenharmony_ci
27954aa6d63Sopenharmony_civoid CentralDirectory::SetDiskNumStart(uint16_t diskNumStart)
28054aa6d63Sopenharmony_ci{
28154aa6d63Sopenharmony_ci    m_diskNumStart = diskNumStart;
28254aa6d63Sopenharmony_ci}
28354aa6d63Sopenharmony_ci
28454aa6d63Sopenharmony_cishort CentralDirectory::GetInternalFile()
28554aa6d63Sopenharmony_ci{
28654aa6d63Sopenharmony_ci    return m_internalFile;
28754aa6d63Sopenharmony_ci}
28854aa6d63Sopenharmony_ci
28954aa6d63Sopenharmony_civoid CentralDirectory::SetInternalFile(short internalFile)
29054aa6d63Sopenharmony_ci{
29154aa6d63Sopenharmony_ci    m_internalFile = internalFile;
29254aa6d63Sopenharmony_ci}
29354aa6d63Sopenharmony_ci
29454aa6d63Sopenharmony_ciint CentralDirectory::GetExternalFile()
29554aa6d63Sopenharmony_ci{
29654aa6d63Sopenharmony_ci    return m_externalFile;
29754aa6d63Sopenharmony_ci}
29854aa6d63Sopenharmony_ci
29954aa6d63Sopenharmony_civoid CentralDirectory::SetExternalFile(int externalFile)
30054aa6d63Sopenharmony_ci{
30154aa6d63Sopenharmony_ci    m_externalFile = externalFile;
30254aa6d63Sopenharmony_ci}
30354aa6d63Sopenharmony_ci
30454aa6d63Sopenharmony_ciuint32_t CentralDirectory::GetOffset()
30554aa6d63Sopenharmony_ci{
30654aa6d63Sopenharmony_ci    return m_offset;
30754aa6d63Sopenharmony_ci}
30854aa6d63Sopenharmony_ci
30954aa6d63Sopenharmony_civoid CentralDirectory::SetOffset(uint32_t offset)
31054aa6d63Sopenharmony_ci{
31154aa6d63Sopenharmony_ci    m_offset = offset;
31254aa6d63Sopenharmony_ci}
31354aa6d63Sopenharmony_ci
31454aa6d63Sopenharmony_cistd::string CentralDirectory::GetFileName()
31554aa6d63Sopenharmony_ci{
31654aa6d63Sopenharmony_ci    return m_fileName;
31754aa6d63Sopenharmony_ci}
31854aa6d63Sopenharmony_ci
31954aa6d63Sopenharmony_civoid CentralDirectory::SetFileName(const std::string& fileName)
32054aa6d63Sopenharmony_ci{
32154aa6d63Sopenharmony_ci    m_fileName = fileName;
32254aa6d63Sopenharmony_ci}
32354aa6d63Sopenharmony_ci
32454aa6d63Sopenharmony_cistd::string CentralDirectory::GetExtraData() const
32554aa6d63Sopenharmony_ci{
32654aa6d63Sopenharmony_ci    return m_extraData;
32754aa6d63Sopenharmony_ci}
32854aa6d63Sopenharmony_ci
32954aa6d63Sopenharmony_civoid CentralDirectory::SetExtraData(const std::string& extraData)
33054aa6d63Sopenharmony_ci{
33154aa6d63Sopenharmony_ci    m_extraData = extraData;
33254aa6d63Sopenharmony_ci}
33354aa6d63Sopenharmony_ci
33454aa6d63Sopenharmony_cistd::string CentralDirectory::GetComment()
33554aa6d63Sopenharmony_ci{
33654aa6d63Sopenharmony_ci    return m_comment;
33754aa6d63Sopenharmony_ci}
33854aa6d63Sopenharmony_ci
33954aa6d63Sopenharmony_civoid CentralDirectory::SetComment(const std::string& comment)
34054aa6d63Sopenharmony_ci{
34154aa6d63Sopenharmony_ci    m_comment = comment;
34254aa6d63Sopenharmony_ci}
34354aa6d63Sopenharmony_ci
34454aa6d63Sopenharmony_ciuint32_t CentralDirectory::GetLength()
34554aa6d63Sopenharmony_ci{
34654aa6d63Sopenharmony_ci    return m_length;
34754aa6d63Sopenharmony_ci}
34854aa6d63Sopenharmony_ci
34954aa6d63Sopenharmony_civoid CentralDirectory::SetLength(uint32_t length)
35054aa6d63Sopenharmony_ci{
35154aa6d63Sopenharmony_ci    m_length = length;
35254aa6d63Sopenharmony_ci}
35354aa6d63Sopenharmony_ci} // namespace SignatureTools
35454aa6d63Sopenharmony_ci} // namespace OHOS