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 "zip_entry_header.h"
1754aa6d63Sopenharmony_ci#include "signature_tools_log.h"
1854aa6d63Sopenharmony_ci
1954aa6d63Sopenharmony_cinamespace OHOS {
2054aa6d63Sopenharmony_cinamespace SignatureTools {
2154aa6d63Sopenharmony_ciZipEntryHeader* ZipEntryHeader::GetZipEntryHeader(const std::string& bytes)
2254aa6d63Sopenharmony_ci{
2354aa6d63Sopenharmony_ci    ZipEntryHeader* entryHeader = new ZipEntryHeader();
2454aa6d63Sopenharmony_ci    ByteBuffer bf(bytes.c_str(), bytes.size());
2554aa6d63Sopenharmony_ci
2654aa6d63Sopenharmony_ci    int32_t entryHeaderInt32Value;
2754aa6d63Sopenharmony_ci    bf.GetInt32(entryHeaderInt32Value);
2854aa6d63Sopenharmony_ci    if (entryHeaderInt32Value != ZipEntryHeader::SIGNATURE) {
2954aa6d63Sopenharmony_ci        delete entryHeader;
3054aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("find zip entry head failed");
3154aa6d63Sopenharmony_ci        return nullptr;
3254aa6d63Sopenharmony_ci    }
3354aa6d63Sopenharmony_ci
3454aa6d63Sopenharmony_ci    int16_t entryHeaderInt16Value;
3554aa6d63Sopenharmony_ci    bf.GetInt16(entryHeaderInt16Value);
3654aa6d63Sopenharmony_ci    entryHeader->SetVersion(entryHeaderInt16Value);
3754aa6d63Sopenharmony_ci
3854aa6d63Sopenharmony_ci    bf.GetInt16(entryHeaderInt16Value);
3954aa6d63Sopenharmony_ci    entryHeader->SetFlag(entryHeaderInt16Value);
4054aa6d63Sopenharmony_ci
4154aa6d63Sopenharmony_ci    bf.GetInt16(entryHeaderInt16Value);
4254aa6d63Sopenharmony_ci    entryHeader->SetMethod(entryHeaderInt16Value);
4354aa6d63Sopenharmony_ci
4454aa6d63Sopenharmony_ci    bf.GetInt16(entryHeaderInt16Value);
4554aa6d63Sopenharmony_ci    entryHeader->SetLastTime(entryHeaderInt16Value);
4654aa6d63Sopenharmony_ci
4754aa6d63Sopenharmony_ci    bf.GetInt16(entryHeaderInt16Value);
4854aa6d63Sopenharmony_ci    entryHeader->SetLastDate(entryHeaderInt16Value);
4954aa6d63Sopenharmony_ci
5054aa6d63Sopenharmony_ci    bf.GetInt32(entryHeaderInt32Value);
5154aa6d63Sopenharmony_ci    entryHeader->SetCrc32(entryHeaderInt32Value);
5254aa6d63Sopenharmony_ci
5354aa6d63Sopenharmony_ci    uint32_t entryHeaderUInt32Value;
5454aa6d63Sopenharmony_ci    bf.GetUInt32(entryHeaderUInt32Value);
5554aa6d63Sopenharmony_ci    entryHeader->SetCompressedSize(entryHeaderUInt32Value);
5654aa6d63Sopenharmony_ci
5754aa6d63Sopenharmony_ci    bf.GetUInt32(entryHeaderUInt32Value);
5854aa6d63Sopenharmony_ci    entryHeader->SetUnCompressedSize(entryHeaderUInt32Value);
5954aa6d63Sopenharmony_ci
6054aa6d63Sopenharmony_ci    uint16_t entryHeaderUInt16Value;
6154aa6d63Sopenharmony_ci    bf.GetUInt16(entryHeaderUInt16Value);
6254aa6d63Sopenharmony_ci    entryHeader->SetFileNameLength(entryHeaderUInt16Value);
6354aa6d63Sopenharmony_ci
6454aa6d63Sopenharmony_ci    bf.GetUInt16(entryHeaderUInt16Value);
6554aa6d63Sopenharmony_ci    entryHeader->SetExtraLength(entryHeaderUInt16Value);
6654aa6d63Sopenharmony_ci
6754aa6d63Sopenharmony_ci    entryHeader->SetLength(HEADER_LENGTH + entryHeader->GetFileNameLength() + entryHeader->GetExtraLength());
6854aa6d63Sopenharmony_ci
6954aa6d63Sopenharmony_ci    return entryHeader;
7054aa6d63Sopenharmony_ci}
7154aa6d63Sopenharmony_ci
7254aa6d63Sopenharmony_civoid ZipEntryHeader::ReadFileName(const std::string& bytes)
7354aa6d63Sopenharmony_ci{
7454aa6d63Sopenharmony_ci    ByteBuffer bf(bytes.c_str(), bytes.size());
7554aa6d63Sopenharmony_ci    if (m_fileNameLength > 0) {
7654aa6d63Sopenharmony_ci        std::string nameBytes(m_fileNameLength, 0);
7754aa6d63Sopenharmony_ci        bf.GetData(&nameBytes[0], m_fileNameLength);
7854aa6d63Sopenharmony_ci        m_fileName = nameBytes;
7954aa6d63Sopenharmony_ci    }
8054aa6d63Sopenharmony_ci}
8154aa6d63Sopenharmony_ci
8254aa6d63Sopenharmony_civoid ZipEntryHeader::ReadExtra(const std::string& bytes)
8354aa6d63Sopenharmony_ci{
8454aa6d63Sopenharmony_ci    ByteBuffer bf(bytes.c_str(), bytes.size());
8554aa6d63Sopenharmony_ci    if (m_extraLength > 0) {
8654aa6d63Sopenharmony_ci        std::string extra(m_extraLength, 0);
8754aa6d63Sopenharmony_ci        bf.GetData(&extra[0], m_extraLength);
8854aa6d63Sopenharmony_ci        m_extraData = extra;
8954aa6d63Sopenharmony_ci    }
9054aa6d63Sopenharmony_ci}
9154aa6d63Sopenharmony_ci
9254aa6d63Sopenharmony_cistd::string ZipEntryHeader::ToBytes()
9354aa6d63Sopenharmony_ci{
9454aa6d63Sopenharmony_ci    ByteBuffer bf(m_length);
9554aa6d63Sopenharmony_ci
9654aa6d63Sopenharmony_ci    bf.PutInt32(SIGNATURE);
9754aa6d63Sopenharmony_ci    bf.PutInt16(m_version);
9854aa6d63Sopenharmony_ci    bf.PutInt16(m_flag);
9954aa6d63Sopenharmony_ci    bf.PutInt16(m_method);
10054aa6d63Sopenharmony_ci    bf.PutInt16(m_lastTime);
10154aa6d63Sopenharmony_ci    bf.PutInt16(m_lastDate);
10254aa6d63Sopenharmony_ci    bf.PutInt32(m_crc32);
10354aa6d63Sopenharmony_ci    bf.PutUInt32(m_compressedSize);
10454aa6d63Sopenharmony_ci    bf.PutUInt32(m_unCompressedSize);
10554aa6d63Sopenharmony_ci    bf.PutUInt16(m_fileNameLength);
10654aa6d63Sopenharmony_ci    bf.PutUInt16(m_extraLength);
10754aa6d63Sopenharmony_ci
10854aa6d63Sopenharmony_ci    if (m_fileNameLength > 0) {
10954aa6d63Sopenharmony_ci        bf.PutData(m_fileName.c_str(), m_fileName.size());
11054aa6d63Sopenharmony_ci    }
11154aa6d63Sopenharmony_ci    if (m_extraLength > 0) {
11254aa6d63Sopenharmony_ci        bf.PutData(m_extraData.c_str(), m_extraData.size());
11354aa6d63Sopenharmony_ci    }
11454aa6d63Sopenharmony_ci
11554aa6d63Sopenharmony_ci    return bf.ToString();
11654aa6d63Sopenharmony_ci}
11754aa6d63Sopenharmony_ci
11854aa6d63Sopenharmony_ciint ZipEntryHeader::GetHeaderLength()
11954aa6d63Sopenharmony_ci{
12054aa6d63Sopenharmony_ci    return HEADER_LENGTH;
12154aa6d63Sopenharmony_ci}
12254aa6d63Sopenharmony_ci
12354aa6d63Sopenharmony_ciint ZipEntryHeader::GetSIGNATURE()
12454aa6d63Sopenharmony_ci{
12554aa6d63Sopenharmony_ci    return SIGNATURE;
12654aa6d63Sopenharmony_ci}
12754aa6d63Sopenharmony_ci
12854aa6d63Sopenharmony_cishort ZipEntryHeader::GetVersion()
12954aa6d63Sopenharmony_ci{
13054aa6d63Sopenharmony_ci    return m_version;
13154aa6d63Sopenharmony_ci}
13254aa6d63Sopenharmony_ci
13354aa6d63Sopenharmony_civoid ZipEntryHeader::SetVersion(short version)
13454aa6d63Sopenharmony_ci{
13554aa6d63Sopenharmony_ci    m_version = version;
13654aa6d63Sopenharmony_ci}
13754aa6d63Sopenharmony_ci
13854aa6d63Sopenharmony_cishort ZipEntryHeader::GetFlag()
13954aa6d63Sopenharmony_ci{
14054aa6d63Sopenharmony_ci    return m_flag;
14154aa6d63Sopenharmony_ci}
14254aa6d63Sopenharmony_ci
14354aa6d63Sopenharmony_civoid ZipEntryHeader::SetFlag(short flag)
14454aa6d63Sopenharmony_ci{
14554aa6d63Sopenharmony_ci    m_flag = flag;
14654aa6d63Sopenharmony_ci}
14754aa6d63Sopenharmony_ci
14854aa6d63Sopenharmony_cishort ZipEntryHeader::GetMethod()
14954aa6d63Sopenharmony_ci{
15054aa6d63Sopenharmony_ci    return m_method;
15154aa6d63Sopenharmony_ci}
15254aa6d63Sopenharmony_ci
15354aa6d63Sopenharmony_civoid ZipEntryHeader::SetMethod(short method)
15454aa6d63Sopenharmony_ci{
15554aa6d63Sopenharmony_ci    m_method = method;
15654aa6d63Sopenharmony_ci}
15754aa6d63Sopenharmony_ci
15854aa6d63Sopenharmony_cishort ZipEntryHeader::GetLastTime()
15954aa6d63Sopenharmony_ci{
16054aa6d63Sopenharmony_ci    return m_lastTime;
16154aa6d63Sopenharmony_ci}
16254aa6d63Sopenharmony_ci
16354aa6d63Sopenharmony_civoid ZipEntryHeader::SetLastTime(short lastTime)
16454aa6d63Sopenharmony_ci{
16554aa6d63Sopenharmony_ci    m_lastTime = lastTime;
16654aa6d63Sopenharmony_ci}
16754aa6d63Sopenharmony_ci
16854aa6d63Sopenharmony_cishort ZipEntryHeader::GetLastDate()
16954aa6d63Sopenharmony_ci{
17054aa6d63Sopenharmony_ci    return m_lastDate;
17154aa6d63Sopenharmony_ci}
17254aa6d63Sopenharmony_ci
17354aa6d63Sopenharmony_civoid ZipEntryHeader::SetLastDate(short lastDate)
17454aa6d63Sopenharmony_ci{
17554aa6d63Sopenharmony_ci    m_lastDate = lastDate;
17654aa6d63Sopenharmony_ci}
17754aa6d63Sopenharmony_ci
17854aa6d63Sopenharmony_ciint ZipEntryHeader::GetCrc32()
17954aa6d63Sopenharmony_ci{
18054aa6d63Sopenharmony_ci    return m_crc32;
18154aa6d63Sopenharmony_ci}
18254aa6d63Sopenharmony_ci
18354aa6d63Sopenharmony_civoid ZipEntryHeader::SetCrc32(int crc32)
18454aa6d63Sopenharmony_ci{
18554aa6d63Sopenharmony_ci    m_crc32 = crc32;
18654aa6d63Sopenharmony_ci}
18754aa6d63Sopenharmony_ci
18854aa6d63Sopenharmony_ciuint32_t ZipEntryHeader::GetCompressedSize()
18954aa6d63Sopenharmony_ci{
19054aa6d63Sopenharmony_ci    return m_compressedSize;
19154aa6d63Sopenharmony_ci}
19254aa6d63Sopenharmony_ci
19354aa6d63Sopenharmony_civoid ZipEntryHeader::SetCompressedSize(uint32_t compressedSize)
19454aa6d63Sopenharmony_ci{
19554aa6d63Sopenharmony_ci    m_compressedSize = compressedSize;
19654aa6d63Sopenharmony_ci}
19754aa6d63Sopenharmony_ci
19854aa6d63Sopenharmony_ciuint32_t ZipEntryHeader::GetUnCompressedSize()
19954aa6d63Sopenharmony_ci{
20054aa6d63Sopenharmony_ci    return m_unCompressedSize;
20154aa6d63Sopenharmony_ci}
20254aa6d63Sopenharmony_ci
20354aa6d63Sopenharmony_civoid ZipEntryHeader::SetUnCompressedSize(uint32_t unCompressedSize)
20454aa6d63Sopenharmony_ci{
20554aa6d63Sopenharmony_ci    m_unCompressedSize = unCompressedSize;
20654aa6d63Sopenharmony_ci}
20754aa6d63Sopenharmony_ci
20854aa6d63Sopenharmony_ciuint16_t ZipEntryHeader::GetFileNameLength()
20954aa6d63Sopenharmony_ci{
21054aa6d63Sopenharmony_ci    return m_fileNameLength;
21154aa6d63Sopenharmony_ci}
21254aa6d63Sopenharmony_ci
21354aa6d63Sopenharmony_civoid ZipEntryHeader::SetFileNameLength(uint16_t fileNameLength)
21454aa6d63Sopenharmony_ci{
21554aa6d63Sopenharmony_ci    m_fileNameLength = fileNameLength;
21654aa6d63Sopenharmony_ci}
21754aa6d63Sopenharmony_ci
21854aa6d63Sopenharmony_ciuint16_t ZipEntryHeader::GetExtraLength()
21954aa6d63Sopenharmony_ci{
22054aa6d63Sopenharmony_ci    return m_extraLength;
22154aa6d63Sopenharmony_ci}
22254aa6d63Sopenharmony_ci
22354aa6d63Sopenharmony_civoid ZipEntryHeader::SetExtraLength(uint16_t extraLength)
22454aa6d63Sopenharmony_ci{
22554aa6d63Sopenharmony_ci    m_extraLength = extraLength;
22654aa6d63Sopenharmony_ci}
22754aa6d63Sopenharmony_ci
22854aa6d63Sopenharmony_cistd::string ZipEntryHeader::GetFileName() const
22954aa6d63Sopenharmony_ci{
23054aa6d63Sopenharmony_ci    return m_fileName;
23154aa6d63Sopenharmony_ci}
23254aa6d63Sopenharmony_ci
23354aa6d63Sopenharmony_civoid ZipEntryHeader::SetFileName(const std::string& fileName)
23454aa6d63Sopenharmony_ci{
23554aa6d63Sopenharmony_ci    m_fileName = fileName;
23654aa6d63Sopenharmony_ci}
23754aa6d63Sopenharmony_ci
23854aa6d63Sopenharmony_cistd::string ZipEntryHeader::GetExtraData() const
23954aa6d63Sopenharmony_ci{
24054aa6d63Sopenharmony_ci    return m_extraData;
24154aa6d63Sopenharmony_ci}
24254aa6d63Sopenharmony_ci
24354aa6d63Sopenharmony_civoid ZipEntryHeader::SetExtraData(const std::string& extraData)
24454aa6d63Sopenharmony_ci{
24554aa6d63Sopenharmony_ci    m_extraData = extraData;
24654aa6d63Sopenharmony_ci}
24754aa6d63Sopenharmony_ci
24854aa6d63Sopenharmony_ciuint32_t ZipEntryHeader::GetLength()
24954aa6d63Sopenharmony_ci{
25054aa6d63Sopenharmony_ci    return m_length;
25154aa6d63Sopenharmony_ci}
25254aa6d63Sopenharmony_ci
25354aa6d63Sopenharmony_civoid ZipEntryHeader::SetLength(uint32_t length)
25454aa6d63Sopenharmony_ci{
25554aa6d63Sopenharmony_ci    m_length = length;
25654aa6d63Sopenharmony_ci}
25754aa6d63Sopenharmony_ci} // namespace SignatureTools
25854aa6d63Sopenharmony_ci} // namespace OHOS