185 lines
6.0 KiB
C
185 lines
6.0 KiB
C
/*
|
|
* Copyright (C) 2013-2022 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
|
|
* Copyright (C) 2007-2013 Sourcefire, Inc.
|
|
*
|
|
* Authors: Alberto Wu
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
* MA 02110-1301, USA.
|
|
*/
|
|
|
|
#ifndef __UNZIP_H
|
|
#define __UNZIP_H
|
|
|
|
#if HAVE_CONFIG_H
|
|
#include "clamav-config.h"
|
|
#endif
|
|
|
|
#include "others.h"
|
|
|
|
// Callback is the same as cli_magic_scan_desc
|
|
typedef cl_error_t (*zip_cb)(int fd, const char *filepath, cli_ctx *ctx, const char *name, uint32_t attributes);
|
|
#define zip_scan_cb cli_magic_scan_desc
|
|
|
|
#define MAX_ZIP_REQUESTS 10
|
|
struct zip_requests {
|
|
const char *names[MAX_ZIP_REQUESTS];
|
|
size_t namelens[MAX_ZIP_REQUESTS];
|
|
int namecnt;
|
|
|
|
uint32_t loff;
|
|
int found, match;
|
|
};
|
|
|
|
cl_error_t cli_unzip(cli_ctx *);
|
|
cl_error_t unzip_single_internal(cli_ctx *, off_t, zip_cb);
|
|
cl_error_t cli_unzip_single(cli_ctx *, off_t);
|
|
|
|
cl_error_t unzip_search_add(struct zip_requests *, const char *, size_t);
|
|
cl_error_t unzip_search(cli_ctx *, fmap_t *, struct zip_requests *);
|
|
cl_error_t unzip_search_single(cli_ctx *, const char *, size_t, uint32_t *);
|
|
|
|
// clang-format off
|
|
#ifdef UNZIP_PRIVATE
|
|
#define F_ENCR (1<<0)
|
|
#define F_ALGO1 (1<<1)
|
|
#define F_ALGO2 (1<<2)
|
|
#define F_USEDD (1<<3)
|
|
#define F_RSVD1 (1<<4)
|
|
#define F_PATCH (1<<5)
|
|
#define F_STRNG (1<<6)
|
|
#define F_UNUS1 (1<<7)
|
|
#define F_UNUS2 (1<<8)
|
|
#define F_UNUS3 (1<<9)
|
|
#define F_UNUS4 (1<<10)
|
|
#define F_UTF8 (1<<11)
|
|
#define F_RSVD2 (1<<12)
|
|
#define F_MSKED (1<<13)
|
|
#define F_RSVD3 (1<<14)
|
|
#define F_RSVD4 (1<<15)
|
|
// clang-format on
|
|
|
|
enum ALGO {
|
|
ALG_STORED,
|
|
ALG_SHRUNK,
|
|
ALG_REDUCE1,
|
|
ALG_REDUCE2,
|
|
ALG_REDUCE3,
|
|
ALG_REDUCE4,
|
|
ALG_IMPLODE,
|
|
ALG_TOKENZD,
|
|
ALG_DEFLATE,
|
|
ALG_DEFLATE64,
|
|
ALG_OLDTERSE,
|
|
ALG_RSVD1,
|
|
ALG_BZIP2,
|
|
ALG_RSVD2,
|
|
ALG_LZMA,
|
|
ALG_RSVD3,
|
|
ALG_RSVD4,
|
|
ALG_RSVD5,
|
|
ALG_NEWTERSE,
|
|
ALG_LZ77,
|
|
ALG_WAVPACK = 97,
|
|
ALG_PPMD
|
|
};
|
|
|
|
/*
|
|
* Local File Header format:
|
|
*/
|
|
/* struct LH { */
|
|
/* uint32_t magic; */
|
|
/* uint16_t version; */
|
|
/* uint16_t flags; */
|
|
/* uint16_t method; */
|
|
/* uint32_t mtime; */
|
|
/* uint32_t crc32; */
|
|
/* uint32_t csize; */
|
|
/* uint32_t usize; */
|
|
/* uint16_t flen; */
|
|
/* uint16_t elen; */
|
|
/* char fname[flen] */
|
|
/* char extra[elen] */
|
|
/* } __attribute__((packed)); */
|
|
|
|
/*
|
|
* Local File Header convenience macros:
|
|
*/
|
|
// clang-format off
|
|
#define LOCAL_HEADER_magic ((uint32_t)cli_readint32((uint8_t *)(local_header)+0))
|
|
#define LOCAL_HEADER_version ((uint16_t)cli_readint16((uint8_t *)(local_header)+4))
|
|
#define LOCAL_HEADER_flags ((uint16_t)cli_readint16((uint8_t *)(local_header)+6))
|
|
#define LOCAL_HEADER_method ((uint16_t)cli_readint16((uint8_t *)(local_header)+8))
|
|
#define LOCAL_HEADER_mtime ((uint32_t)cli_readint32((uint8_t *)(local_header)+10))
|
|
#define LOCAL_HEADER_crc32 ((uint32_t)cli_readint32((uint8_t *)(local_header)+14))
|
|
#define LOCAL_HEADER_csize ((uint32_t)cli_readint32((uint8_t *)(local_header)+18))
|
|
#define LOCAL_HEADER_usize ((uint32_t)cli_readint32((uint8_t *)(local_header)+22))
|
|
#define LOCAL_HEADER_flen ((uint16_t)cli_readint16((uint8_t *)(local_header)+26))
|
|
#define LOCAL_HEADER_elen ((uint16_t)cli_readint16((uint8_t *)(local_header)+28))
|
|
#define SIZEOF_LOCAL_HEADER 30
|
|
// clang-format on
|
|
|
|
/*
|
|
* Central Directory File Header format:
|
|
*/
|
|
/* struct CH { */
|
|
/* uint32_t magic; */
|
|
/* uint16_t vermade; */
|
|
/* uint16_t verneed; */
|
|
/* uint16_t flags; */
|
|
/* uint16_t method; */
|
|
/* uint32_t mtime; */
|
|
/* uint32_t crc32; */
|
|
/* uint32_t csize; */
|
|
/* uint32_t usize; */
|
|
/* uint16_t flen; */
|
|
/* uint16_t elen; */
|
|
/* uint16_t clen; */
|
|
/* uint16_t dsk; */
|
|
/* uint16_t iattrib; */
|
|
/* uint32_t eattrib; */
|
|
/* uint32_t off; */
|
|
/* char fname[flen] */
|
|
/* char extra[elen] */
|
|
/* char comment[clen] */
|
|
/* } __attribute__((packed)); */
|
|
|
|
/*
|
|
* Central Directory File Header convenience macro's:
|
|
*/
|
|
// clang-format off
|
|
#define CENTRAL_HEADER_magic ((uint32_t)cli_readint32((uint8_t *)(central_header)+0))
|
|
#define CENTRAL_HEADER_vermade ((uint16_t)cli_readint16((uint8_t *)(central_header)+4))
|
|
#define CENTRAL_HEADER_verneed ((uint16_t)cli_readint16((uint8_t *)(central_header)+6))
|
|
#define CENTRAL_HEADER_flags ((uint16_t)cli_readint16((uint8_t *)(central_header)+8))
|
|
#define CENTRAL_HEADER_method ((uint16_t)cli_readint16((uint8_t *)(central_header)+10))
|
|
#define CENTRAL_HEADER_mtime ((uint32_t)cli_readint32((uint8_t *)(central_header)+12))
|
|
#define CENTRAL_HEADER_crc32 ((uint32_t)cli_readint32((uint8_t *)(central_header)+16))
|
|
#define CENTRAL_HEADER_csize ((uint32_t)cli_readint32((uint8_t *)(central_header)+20))
|
|
#define CENTRAL_HEADER_usize ((uint32_t)cli_readint32((uint8_t *)(central_header)+24))
|
|
#define CENTRAL_HEADER_flen ((uint16_t)cli_readint16((uint8_t *)(central_header)+28))
|
|
#define CENTRAL_HEADER_extra_len ((uint16_t)cli_readint16((uint8_t *)(central_header)+30))
|
|
#define CENTRAL_HEADER_comment_len ((uint16_t)cli_readint16((uint8_t *)(central_header)+32))
|
|
#define CENTRAL_HEADER_disk_num ((uint16_t)cli_readint16((uint8_t *)(central_header)+34))
|
|
#define CENTRAL_HEADER_iattrib ((uint16_t)cli_readint16((uint8_t *)(central_header)+36))
|
|
#define CENTRAL_HEADER_eattrib ((uint32_t)cli_readint32((uint8_t *)(central_header)+38))
|
|
#define CENTRAL_HEADER_off ((uint32_t)cli_readint32((uint8_t *)(central_header)+42))
|
|
// clang-format on
|
|
|
|
#define SIZEOF_CENTRAL_HEADER 46
|
|
#define SIZEOF_ENCRYPTION_HEADER 12
|
|
#endif /* UNZIP_PRIVATE */
|
|
|
|
#endif /* __UNZIP_H */
|