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 <fstream>
1754aa6d63Sopenharmony_ci#include <iostream>
1854aa6d63Sopenharmony_ci
1954aa6d63Sopenharmony_ci#include "file_utils.h"
2054aa6d63Sopenharmony_ci#include "signature_tools_log.h"
2154aa6d63Sopenharmony_ci#include "zip_entry_data.h"
2254aa6d63Sopenharmony_ci
2354aa6d63Sopenharmony_cinamespace OHOS {
2454aa6d63Sopenharmony_cinamespace SignatureTools {
2554aa6d63Sopenharmony_ciZipEntryHeader* ZipEntryData::GetZipEntryHeader()
2654aa6d63Sopenharmony_ci{
2754aa6d63Sopenharmony_ci    return m_zipEntryHeader;
2854aa6d63Sopenharmony_ci}
2954aa6d63Sopenharmony_ci
3054aa6d63Sopenharmony_ciZipEntryData* ZipEntryData::GetZipEntry(std::ifstream& input, uint32_t entryOffset, uint32_t fileSize)
3154aa6d63Sopenharmony_ci{
3254aa6d63Sopenharmony_ci    uint32_t offset = entryOffset;
3354aa6d63Sopenharmony_ci    /* read entry header by file and offset. */
3454aa6d63Sopenharmony_ci    std::string retStr;
3554aa6d63Sopenharmony_ci    if (FileUtils::ReadInputByOffsetAndLength(input, entryOffset, ZipEntryHeader::HEADER_LENGTH, retStr) != 0) {
3654aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGE("read zip entry head failed in file");
3754aa6d63Sopenharmony_ci        return nullptr;
3854aa6d63Sopenharmony_ci    }
3954aa6d63Sopenharmony_ci    ZipEntryHeader* entryHeader = ZipEntryHeader::GetZipEntryHeader(retStr);
4054aa6d63Sopenharmony_ci    if (!entryHeader) {
4154aa6d63Sopenharmony_ci        return nullptr;
4254aa6d63Sopenharmony_ci    }
4354aa6d63Sopenharmony_ci    offset += ZipEntryHeader::HEADER_LENGTH;
4454aa6d63Sopenharmony_ci
4554aa6d63Sopenharmony_ci    /* read entry file name and extra by offset. */
4654aa6d63Sopenharmony_ci    if (!ReadEntryFileNameAndExtraByOffset(input, entryHeader, offset)) {
4754aa6d63Sopenharmony_ci        return nullptr;
4854aa6d63Sopenharmony_ci    }
4954aa6d63Sopenharmony_ci    /* skip file data , save file offset and size. */
5054aa6d63Sopenharmony_ci    ZipEntryData* entry = new ZipEntryData();
5154aa6d63Sopenharmony_ci    entry->SetFileOffset(offset);
5254aa6d63Sopenharmony_ci    entry->SetFileSize(fileSize);
5354aa6d63Sopenharmony_ci    input.seekg(fileSize, std::ios::cur);
5454aa6d63Sopenharmony_ci    int64_t entryLength = entryHeader->GetLength() + fileSize;
5554aa6d63Sopenharmony_ci
5654aa6d63Sopenharmony_ci    /* set desc null flag */
5754aa6d63Sopenharmony_ci    if ((entryHeader->GetFlag() & HAS_DATA_DESCRIPTOR_MASK) != NOT_HAS_DATA_DESCRIPTOR_FLAG) {
5854aa6d63Sopenharmony_ci        /* if entry has data descriptor, read entry data descriptor. */
5954aa6d63Sopenharmony_ci        std::string retStr;
6054aa6d63Sopenharmony_ci        if (FileUtils::ReadInputByLength(input, DataDescriptor::DES_LENGTH, retStr) != 0) {
6154aa6d63Sopenharmony_ci            SIGNATURE_TOOLS_LOGE("read entry data descriptor failed in file");
6254aa6d63Sopenharmony_ci            return nullptr;
6354aa6d63Sopenharmony_ci        }
6454aa6d63Sopenharmony_ci        DataDescriptor* dataDesc = DataDescriptor::GetDataDescriptor(retStr);
6554aa6d63Sopenharmony_ci        if (!dataDesc) {
6654aa6d63Sopenharmony_ci            return nullptr;
6754aa6d63Sopenharmony_ci        }
6854aa6d63Sopenharmony_ci        entryLength += DataDescriptor::DES_LENGTH;
6954aa6d63Sopenharmony_ci        entry->SetDataDescriptor(dataDesc);
7054aa6d63Sopenharmony_ci    }
7154aa6d63Sopenharmony_ci    entry->SetZipEntryHeader(entryHeader);
7254aa6d63Sopenharmony_ci    entry->SetLength(entryLength);
7354aa6d63Sopenharmony_ci    return entry;
7454aa6d63Sopenharmony_ci}
7554aa6d63Sopenharmony_ci
7654aa6d63Sopenharmony_cibool ZipEntryData::ReadEntryFileNameAndExtraByOffset(std::ifstream& input, ZipEntryHeader* entryHeader,
7754aa6d63Sopenharmony_ci    uint32_t& offset)
7854aa6d63Sopenharmony_ci{
7954aa6d63Sopenharmony_ci    if (entryHeader->GetFileNameLength() > 0) {
8054aa6d63Sopenharmony_ci        std::string fileNameStr;
8154aa6d63Sopenharmony_ci        if (FileUtils::ReadInputByLength(input, entryHeader->GetFileNameLength(), fileNameStr) != 0) {
8254aa6d63Sopenharmony_ci            SIGNATURE_TOOLS_LOGE("read entry file name failed in file");
8354aa6d63Sopenharmony_ci            return false;
8454aa6d63Sopenharmony_ci        }
8554aa6d63Sopenharmony_ci        entryHeader->ReadFileName(fileNameStr);
8654aa6d63Sopenharmony_ci        offset += entryHeader->GetFileNameLength();
8754aa6d63Sopenharmony_ci    }
8854aa6d63Sopenharmony_ci    if (entryHeader->GetExtraLength() > 0) {
8954aa6d63Sopenharmony_ci        std::string extraStr;
9054aa6d63Sopenharmony_ci        if (FileUtils::ReadInputByLength(input, entryHeader->GetExtraLength(), extraStr) != 0) {
9154aa6d63Sopenharmony_ci            SIGNATURE_TOOLS_LOGE("read entry file extra failed in file");
9254aa6d63Sopenharmony_ci            return false;
9354aa6d63Sopenharmony_ci        }
9454aa6d63Sopenharmony_ci        entryHeader->ReadExtra(extraStr);
9554aa6d63Sopenharmony_ci        offset += entryHeader->GetExtraLength();
9654aa6d63Sopenharmony_ci    }
9754aa6d63Sopenharmony_ci    return true;
9854aa6d63Sopenharmony_ci}
9954aa6d63Sopenharmony_ci
10054aa6d63Sopenharmony_civoid ZipEntryData::SetZipEntryHeader(ZipEntryHeader* zipEntryHeader)
10154aa6d63Sopenharmony_ci{
10254aa6d63Sopenharmony_ci    m_zipEntryHeader = zipEntryHeader;
10354aa6d63Sopenharmony_ci}
10454aa6d63Sopenharmony_ci
10554aa6d63Sopenharmony_ciDataDescriptor* ZipEntryData::GetDataDescriptor()
10654aa6d63Sopenharmony_ci{
10754aa6d63Sopenharmony_ci    return m_dataDescriptor;
10854aa6d63Sopenharmony_ci}
10954aa6d63Sopenharmony_ci
11054aa6d63Sopenharmony_civoid ZipEntryData::SetDataDescriptor(DataDescriptor* dataDescriptor)
11154aa6d63Sopenharmony_ci{
11254aa6d63Sopenharmony_ci    m_dataDescriptor = dataDescriptor;
11354aa6d63Sopenharmony_ci}
11454aa6d63Sopenharmony_ci
11554aa6d63Sopenharmony_ciuint32_t ZipEntryData::GetFileOffset()
11654aa6d63Sopenharmony_ci{
11754aa6d63Sopenharmony_ci    return m_fileOffset;
11854aa6d63Sopenharmony_ci}
11954aa6d63Sopenharmony_ci
12054aa6d63Sopenharmony_civoid ZipEntryData::SetFileOffset(uint32_t fileOffset)
12154aa6d63Sopenharmony_ci{
12254aa6d63Sopenharmony_ci    m_fileOffset = fileOffset;
12354aa6d63Sopenharmony_ci}
12454aa6d63Sopenharmony_ci
12554aa6d63Sopenharmony_ciuint32_t ZipEntryData::GetFileSize()
12654aa6d63Sopenharmony_ci{
12754aa6d63Sopenharmony_ci    return m_fileSize;
12854aa6d63Sopenharmony_ci}
12954aa6d63Sopenharmony_ci
13054aa6d63Sopenharmony_civoid ZipEntryData::SetFileSize(uint32_t fileSize)
13154aa6d63Sopenharmony_ci{
13254aa6d63Sopenharmony_ci    m_fileSize = fileSize;
13354aa6d63Sopenharmony_ci}
13454aa6d63Sopenharmony_ci
13554aa6d63Sopenharmony_ciuint32_t ZipEntryData::GetLength()
13654aa6d63Sopenharmony_ci{
13754aa6d63Sopenharmony_ci    return m_length;
13854aa6d63Sopenharmony_ci}
13954aa6d63Sopenharmony_ci
14054aa6d63Sopenharmony_civoid ZipEntryData::SetLength(uint32_t length)
14154aa6d63Sopenharmony_ci{
14254aa6d63Sopenharmony_ci    m_length = length;
14354aa6d63Sopenharmony_ci}
14454aa6d63Sopenharmony_ci} // namespace SignatureTools
14554aa6d63Sopenharmony_ci} // namespace OHOS